diff --git a/apps/api/openapi.json b/apps/api/openapi.json index 50446f5..3fd7781 100644 --- a/apps/api/openapi.json +++ b/apps/api/openapi.json @@ -3324,6 +3324,309 @@ ] } }, + "/api/issues/{issue}/vote": { + "put": { + "description": "Anyone signed in, on a public project (that is the point: the people it is for say what they want); members on a private one. Voting twice changes nothing.", + "operationId": "IssuesController_vote", + "parameters": [ + { + "name": "issue", + "required": true, + "in": "path", + "description": "Ticket id or key", + "schema": { + "example": "WEB-12", + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CommandResultDto" + } + } + } + }, + "400": { + "description": "Invalid input", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "401": { + "description": "Missing or rejected Pireon token", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "403": { + "description": "Not a member of the project (or not allowed)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "404": { + "description": "Not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "409": { + "description": "Someone changed it at the same time: retry", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "422": { + "description": "Business rule (e.g. a transition the workflow forbids)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "pireon-oauth": [] + }, + { + "pireon": [] + } + ], + "summary": "Vote for the ticket", + "tags": [ + "Issues" + ] + }, + "delete": { + "operationId": "IssuesController_unvote", + "parameters": [ + { + "name": "issue", + "required": true, + "in": "path", + "description": "Ticket id or key", + "schema": { + "example": "WEB-12", + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CommandResultDto" + } + } + } + }, + "400": { + "description": "Invalid input", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "401": { + "description": "Missing or rejected Pireon token", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "403": { + "description": "Not a member of the project (or not allowed)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "404": { + "description": "Not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "409": { + "description": "Someone changed it at the same time: retry", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "422": { + "description": "Business rule (e.g. a transition the workflow forbids)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "pireon-oauth": [] + }, + { + "pireon": [] + } + ], + "summary": "Take back my vote for the ticket", + "tags": [ + "Issues" + ] + } + }, + "/api/issues/{issue}/duplicate": { + "post": { + "description": "Copies what it says (type, title, description, area, priority, labels, Figma, estimate, dates, parent and checklist steps, unticked), not where it stands: the copy starts in the first status, unassigned, out of sprints and releases, without comments or files. The result carries its key.", + "operationId": "IssuesController_duplicate", + "parameters": [ + { + "name": "issue", + "required": true, + "in": "path", + "description": "Ticket id or key", + "schema": { + "example": "WEB-12", + "type": "string" + } + } + ], + "responses": { + "201": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CommandResultDto" + } + } + } + }, + "400": { + "description": "Invalid input", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "401": { + "description": "Missing or rejected Pireon token", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "403": { + "description": "Not a member of the project (or not allowed)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "404": { + "description": "Not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "409": { + "description": "Someone changed it at the same time: retry", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "422": { + "description": "Business rule (e.g. a transition the workflow forbids)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "pireon-oauth": [] + }, + { + "pireon": [] + } + ], + "summary": "Duplicate the ticket", + "tags": [ + "Issues" + ] + } + }, "/api/projects/{project}/trash": { "get": { "operationId": "IssuesController_trashed", @@ -4653,7 +4956,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/CommandResultDto" + "$ref": "#/components/schemas/AttachmentResultDto" } } } @@ -5129,6 +5432,116 @@ ] } }, + "/api/comments/{commentId}/reactions": { + "post": { + "description": "One of 👍 👎 😄 🎉 😕 ❤️ 🚀 👀; repeating it changes nothing.", + "operationId": "CommentsController_react", + "parameters": [ + { + "name": "commentId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ReactToCommentDto" + } + } + } + }, + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CommandResultDto" + } + } + } + }, + "400": { + "description": "Invalid input", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "401": { + "description": "Missing or rejected Pireon token", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "403": { + "description": "Not a member of the project (or not allowed)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "404": { + "description": "Not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "409": { + "description": "Someone changed it at the same time: retry", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "422": { + "description": "Business rule (e.g. a transition the workflow forbids)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "pireon-oauth": [] + }, + { + "pireon": [] + } + ], + "summary": "React to a comment, or take the reaction back (members)", + "tags": [ + "Comments" + ] + } + }, "/api/me/releases": { "get": { "operationId": "ReleasesController_upcoming", @@ -6321,6 +6734,60 @@ "security": [] } }, + "/api/explore/projects/{project}/proposals": { + "post": { + "description": "For public projects that take proposals. It becomes a ticket labelled `propuesta`, opened by TaskStream in the first status (Bug or Feature), signed with `author` if given. Five per address every 15 minutes.", + "operationId": "ExploreController_propose", + "parameters": [ + { + "name": "project", + "required": true, + "in": "path", + "description": "Project id or key", + "schema": { + "example": "WEB", + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ProposalDto" + } + } + } + }, + "responses": { + "201": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ProposalResultDto" + } + } + } + }, + "403": { + "description": "It does not take proposals" + }, + "404": { + "description": "Not a public project" + }, + "429": { + "description": "Too many from this address" + } + }, + "summary": "Report a bug or propose an idea (no token needed)", + "tags": [ + "Explore" + ], + "security": [] + } + }, "/api/me/notifications": { "get": { "operationId": "NotificationsController_mine", @@ -9794,6 +10261,10 @@ "type": "boolean", "description": "Readable by anyone, also without a token" }, + "acceptsProposals": { + "type": "boolean", + "description": "Takes bug reports and ideas from anyone (POST /api/explore/projects/{project}/proposals) while public" + }, "owner": { "$ref": "#/components/schemas/UserRefDto" }, @@ -9825,6 +10296,7 @@ "name", "description", "isPublic", + "acceptsProposals", "owner", "members", "settings", @@ -9901,6 +10373,10 @@ "type": "boolean", "default": false, "description": "Anyone can read it without signing in (board, tickets, comments, releases, activity, statistics)" + }, + "acceptsProposals": { + "type": "boolean", + "description": "Take bug reports and ideas from anyone through the public form (while public)" } } }, @@ -10510,6 +10986,17 @@ } ] }, + "blockedBy": { + "description": "Open tickets it waits for: the ones that block it and the ones it depends on", + "type": "array", + "items": { + "$ref": "#/components/schemas/IssueParentDto" + } + }, + "votes": { + "type": "number", + "description": "How many want it done" + }, "rank": { "type": "string", "description": "Place in the backlog and its board column (ascending, as text)" @@ -10575,6 +11062,8 @@ "attachments", "watchers", "parent", + "blockedBy", + "votes", "rank", "checklist", "trashedAt", @@ -11426,6 +11915,25 @@ "targetIssue" ] }, + "CommentReactionDto": { + "type": "object", + "properties": { + "emoji": { + "type": "string", + "example": "👍" + }, + "users": { + "type": "array", + "items": { + "$ref": "#/components/schemas/UserRefDto" + } + } + }, + "required": [ + "emoji", + "users" + ] + }, "CommentDto": { "type": "object", "properties": { @@ -11454,6 +11962,13 @@ "type": "boolean", "description": "Deleted, but kept (without its text) while it has replies" }, + "reactions": { + "description": "In the order they are offered; only the ones somebody chose", + "type": "array", + "items": { + "$ref": "#/components/schemas/CommentReactionDto" + } + }, "createdAt": { "type": "string", "format": "date-time" @@ -11474,6 +11989,7 @@ "body", "replyTo", "deleted", + "reactions", "createdAt", "editedAt", "version" @@ -11533,6 +12049,34 @@ "file" ] }, + "AttachmentResultDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "Id of the aggregate written" + }, + "key": { + "type": "string", + "description": "Human key when one was assigned (project or issue)", + "example": "WEB-13" + }, + "version": { + "type": "number", + "description": "Version after the write. Writes are acknowledged at once and the read model catches up asynchronously: a GET may briefly return the previous version (or 404 right after a create)." + }, + "attachmentId": { + "type": "string", + "format": "uuid", + "description": "The new file; `![name](attachment:)` shows an image inside a description or comment" + } + }, + "required": [ + "id", + "version", + "attachmentId" + ] + }, "CommentBodyDto": { "type": "object", "properties": { @@ -11546,6 +12090,33 @@ "body" ] }, + "ReactToCommentDto": { + "type": "object", + "properties": { + "emoji": { + "type": "string", + "enum": [ + "👍", + "👎", + "😄", + "🎉", + "😕", + "❤️", + "🚀", + "👀" + ], + "example": "👍" + }, + "on": { + "type": "boolean", + "description": "true adds the reaction, false takes it back" + } + }, + "required": [ + "emoji", + "on" + ] + }, "ReleaseStatus": { "type": "string", "enum": [ @@ -11847,6 +12418,10 @@ "done": { "type": "boolean" }, + "votes": { + "type": "number", + "description": "How many want it" + }, "path": { "type": "string", "example": "/p/WEB/issues/WEB-3", @@ -11860,6 +12435,7 @@ "dueDate", "percent", "done", + "votes", "path" ] }, @@ -11927,6 +12503,63 @@ "path" ] }, + "ShowcaseProposalDto": { + "type": "object", + "properties": { + "key": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string", + "description": "A ticket type id" + }, + "path": { + "type": "string", + "example": "/p/WEB/issues/WEB-9" + }, + "votes": { + "type": "number", + "description": "How many want it" + } + }, + "required": [ + "key", + "title", + "type", + "path", + "votes" + ] + }, + "ShowcaseProposalsDto": { + "type": "object", + "properties": { + "open": { + "type": "boolean", + "description": "Whether it takes bug reports and ideas now" + }, + "path": { + "type": "string", + "nullable": true, + "example": "/p/WEB/proponer", + "description": "The form in the web app, while it takes them" + }, + "top": { + "description": "Open proposals, most voted first", + "type": "array", + "items": { + "$ref": "#/components/schemas/ShowcaseProposalDto" + } + } + }, + "required": [ + "open", + "path", + "top" + ] + }, "ShowcaseDto": { "type": "object", "properties": { @@ -11960,6 +12593,9 @@ "items": { "$ref": "#/components/schemas/ShowcaseIssueDto" } + }, + "proposals": { + "$ref": "#/components/schemas/ShowcaseProposalsDto" } }, "required": [ @@ -11967,7 +12603,65 @@ "activeSprint", "roadmap", "releases", - "goodFirst" + "goodFirst", + "proposals" + ] + }, + "ProposalDto": { + "type": "object", + "properties": { + "kind": { + "type": "string", + "enum": [ + "BUG", + "IDEA" + ], + "description": "A bug report or an idea" + }, + "title": { + "type": "string", + "minLength": 3, + "maxLength": 150 + }, + "description": { + "type": "string", + "maxLength": 5000, + "description": "What happens, or what they would like (Markdown)" + }, + "author": { + "type": "string", + "maxLength": 80, + "description": "How they sign it; shown in the ticket (no e-mail: it would be public)" + }, + "website": { + "type": "string", + "description": "Leave empty: a field only bots fill in" + } + }, + "required": [ + "kind", + "title" + ] + }, + "ProposalResultDto": { + "type": "object", + "properties": { + "key": { + "type": "string", + "nullable": true, + "example": "WEB-42", + "description": "The ticket it became" + }, + "path": { + "type": "string", + "nullable": true, + "example": "/p/WEB/issues/WEB-42", + "description": "Where to see it in the web app" + } + }, + "required": [ + "key", + "path" ] }, "NotificationKind": { diff --git a/apps/api/schema.gql b/apps/api/schema.gql index e9c1903..d97b4c4 100644 --- a/apps/api/schema.gql +++ b/apps/api/schema.gql @@ -207,6 +207,9 @@ type Comment { id: ID! issueId: ID! + """In the order they are offered; only the ones somebody chose""" + reactions: [CommentReaction!]! + """The top-level comment it answers; null for a top-level one""" replyTo: ID version: Int! @@ -228,6 +231,14 @@ type CommentPage { total: Int! } +"""One emoji on a comment""" +type CommentReaction { + emoji: String! + + """Who chose it""" + users: [UserRef!]! +} + type CountByAssignee { count: Int! @@ -414,6 +425,11 @@ type Issue { area: String assignee: UserRef attachments: [Attachment!]! + + """ + Open tickets it waits for: the ones that block it and the ones it depends on + """ + blockedBy: [IssueParent!]! checklist: [ChecklistItem!]! commentCount: Int! comments(limit: Int! = 50, offset: Int! = 0): CommentPage! @@ -469,6 +485,12 @@ type Issue { updatedAt: String! version: Int! + """Whether I voted for it""" + voted: Boolean! + + """How many want it done""" + votes: Int! + """People following the ticket""" watchers: [UserRef!]! } @@ -672,6 +694,11 @@ type Mutation { """Delete a sprint that never started; its tickets go back to the backlog""" deleteSprint(sprintId: ID!): CommandResult! deleteWebhook(webhookId: ID!): Boolean! + + """ + A new ticket like this one: what it says, not where it stands (the key comes in the result) + """ + duplicateIssue(issueId: ID!): CommandResult! editComment(body: String!, commentId: ID!): CommandResult! """Relate tickets, e.g. FE DEPENDS_ON BE, QA TESTS FE""" @@ -688,6 +715,9 @@ type Mutation { """Move a ticket in the backlog, between two others of the same project""" rankIssue(input: RankIssueInput!): CommandResult! + """React (👍 👎 😄 🎉 😕 ❤️ 🚀 👀) or take it back (on: false)""" + reactToComment(commentId: ID!, emoji: String!, on: Boolean!): CommandResult! + """ Remove a file from a ticket (whoever uploaded it, or an owner/admin). Upload with the REST API. """ @@ -750,6 +780,11 @@ type Mutation { updateSprint(input: UpdateSprintInput!): CommandResult! updateWebhook(input: UpdateWebhookInput!): Webhook! + """ + Vote for a ticket (on) or take the vote back: anyone signed in on a public project, members on a private one + """ + voteIssue(issueId: ID!, on: Boolean!): CommandResult! + """ Follow a ticket: be told when it moves, is reassigned or gets a comment """ @@ -805,6 +840,9 @@ type NotificationSettings { } type Project { + """Takes bug reports and ideas from anyone (while public)""" + acceptsProposals: Boolean! + """ Statistics of the last `days` days (7-365): created vs resolved, cumulative flow, cycle/lead time, throughput and QA """ @@ -1263,6 +1301,10 @@ input UpdateIssueInput { } input UpdateProjectInput { + """ + Take bug reports and ideas from anyone through the public form (while public) + """ + acceptsProposals: Boolean description: String isPublic: Boolean name: String diff --git a/apps/mcp/src/app/api/taskstream.schema.ts b/apps/mcp/src/app/api/taskstream.schema.ts index 14bedc5..603907d 100644 --- a/apps/mcp/src/app/api/taskstream.schema.ts +++ b/apps/mcp/src/app/api/taskstream.schema.ts @@ -476,6 +476,47 @@ export interface paths { patch?: never; trace?: never; }; + "/api/issues/{issue}/vote": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + /** + * Vote for the ticket + * @description Anyone signed in, on a public project (that is the point: the people it is for say what they want); members on a private one. Voting twice changes nothing. + */ + put: operations["IssuesController_vote"]; + post?: never; + /** Take back my vote for the ticket */ + delete: operations["IssuesController_unvote"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/issues/{issue}/duplicate": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Duplicate the ticket + * @description Copies what it says (type, title, description, area, priority, labels, Figma, estimate, dates, parent and checklist steps, unticked), not where it stands: the copy starts in the first status, unassigned, out of sprints and releases, without comments or files. The result carries its key. + */ + post: operations["IssuesController_duplicate"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; "/api/projects/{project}/trash": { parameters: { query?: never; @@ -716,6 +757,26 @@ export interface paths { patch: operations["CommentsController_edit"]; trace?: never; }; + "/api/comments/{commentId}/reactions": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * React to a comment, or take the reaction back (members) + * @description One of 👍 👎 😄 🎉 😕 ❤️ 🚀 👀; repeating it changes nothing. + */ + post: operations["CommentsController_react"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; "/api/me/releases": { parameters: { query?: never; @@ -937,6 +998,26 @@ export interface paths { patch?: never; trace?: never; }; + "/api/explore/projects/{project}/proposals": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Report a bug or propose an idea (no token needed) + * @description For public projects that take proposals. It becomes a ticket labelled `propuesta`, opened by TaskStream in the first status (Bug or Feature), signed with `author` if given. Five per address every 15 minutes. + */ + post: operations["ExploreController_propose"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; "/api/me/notifications": { parameters: { query?: never; @@ -1540,6 +1621,8 @@ export interface components { description: string | null; /** @description Readable by anyone, also without a token */ isPublic: boolean; + /** @description Takes bug reports and ideas from anyone (POST /api/explore/projects/{project}/proposals) while public */ + acceptsProposals: boolean; owner: components["schemas"]["UserRefDto"]; members: components["schemas"]["ProjectMemberDto"][]; settings: components["schemas"]["ProjectSettingsDto"]; @@ -1585,6 +1668,8 @@ export interface components { * @default false */ isPublic: boolean; + /** @description Take bug reports and ideas from anyone through the public form (while public) */ + acceptsProposals?: boolean; }; WorkflowStatusBodyDto: { /** @@ -1786,6 +1871,10 @@ export interface components { watchers: components["schemas"]["UserRefDto"][]; /** @description The epic or ticket this one breaks down */ parent: components["schemas"]["IssueParentDto"] | null; + /** @description Open tickets it waits for: the ones that block it and the ones it depends on */ + blockedBy: components["schemas"]["IssueParentDto"][]; + /** @description How many want it done */ + votes: number; /** @description Place in the backlog and its board column (ascending, as text) */ rank: string; checklist: components["schemas"]["ChecklistItemDto"][]; @@ -2081,6 +2170,11 @@ export interface components { */ targetIssue: string; }; + CommentReactionDto: { + /** @example 👍 */ + emoji: string; + users: components["schemas"]["UserRefDto"][]; + }; CommentDto: { /** Format: uuid */ id: string; @@ -2096,6 +2190,8 @@ export interface components { replyTo: string | null; /** @description Deleted, but kept (without its text) while it has replies */ deleted: boolean; + /** @description In the order they are offered; only the ones somebody chose */ + reactions: components["schemas"]["CommentReactionDto"][]; /** Format: date-time */ createdAt: string; /** Format: date-time */ @@ -2127,10 +2223,35 @@ export interface components { */ commentId?: string; }; + AttachmentResultDto: { + /** @description Id of the aggregate written */ + id: string; + /** + * @description Human key when one was assigned (project or issue) + * @example WEB-13 + */ + key?: string; + /** @description Version after the write. Writes are acknowledged at once and the read model catches up asynchronously: a GET may briefly return the previous version (or 404 right after a create). */ + version: number; + /** + * Format: uuid + * @description The new file; `![name](attachment:)` shows an image inside a description or comment + */ + attachmentId: string; + }; CommentBodyDto: { /** @example Reproducido en Safari 17. */ body: string; }; + ReactToCommentDto: { + /** + * @example 👍 + * @enum {string} + */ + emoji: "👍" | "👎" | "😄" | "🎉" | "😕" | "❤️" | "🚀" | "👀"; + /** @description true adds the reaction, false takes it back */ + on: boolean; + }; /** @enum {string} */ ReleaseStatus: "PLANNED" | "RELEASED" | "ARCHIVED"; ReleaseDto: { @@ -2235,6 +2356,8 @@ export interface components { dueDate: string | null; percent: number; done: boolean; + /** @description How many want it */ + votes: number; /** * @description In the web app * @example /p/WEB/issues/WEB-3 @@ -2258,6 +2381,27 @@ export interface components { /** @example /p/WEB/issues/WEB-9 */ path: string; }; + ShowcaseProposalDto: { + key: string; + title: string; + /** @description A ticket type id */ + type: string; + /** @example /p/WEB/issues/WEB-9 */ + path: string; + /** @description How many want it */ + votes: number; + }; + ShowcaseProposalsDto: { + /** @description Whether it takes bug reports and ideas now */ + open: boolean; + /** + * @description The form in the web app, while it takes them + * @example /p/WEB/proponer + */ + path: string | null; + /** @description Open proposals, most voted first */ + top: components["schemas"]["ShowcaseProposalDto"][]; + }; ShowcaseDto: { project: components["schemas"]["ShowcaseProjectDto"]; activeSprint: components["schemas"]["ShowcaseSprintDto"] | null; @@ -2265,6 +2409,33 @@ export interface components { releases: components["schemas"]["ShowcaseReleaseDto"][]; /** @description Open tickets labelled good-first-issue */ goodFirst: components["schemas"]["ShowcaseIssueDto"][]; + proposals: components["schemas"]["ShowcaseProposalsDto"]; + }; + ProposalDto: { + /** + * @description A bug report or an idea + * @enum {string} + */ + kind: "BUG" | "IDEA"; + title: string; + /** @description What happens, or what they would like (Markdown) */ + description?: string; + /** @description How they sign it; shown in the ticket (no e-mail: it would be public) */ + author?: string; + /** @description Leave empty: a field only bots fill in */ + website?: string; + }; + ProposalResultDto: { + /** + * @description The ticket it became + * @example WEB-42 + */ + key: string | null; + /** + * @description Where to see it in the web app + * @example /p/WEB/issues/WEB-42 + */ + path: string | null; }; /** @enum {string} */ NotificationKind: "ASSIGNED" | "STATUS_CHANGED" | "QA_FAILED" | "COMMENTED" | "MENTIONED" | "REPLIED" | "WATCHED" | "ADDED_TO_PROJECT" | "REMINDER"; @@ -4753,6 +4924,234 @@ export interface operations { }; }; }; + IssuesController_vote: { + parameters: { + query?: never; + header?: never; + path: { + /** @description Ticket id or key */ + issue: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["CommandResultDto"]; + }; + }; + /** @description Invalid input */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiErrorDto"]; + }; + }; + /** @description Missing or rejected Pireon token */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiErrorDto"]; + }; + }; + /** @description Not a member of the project (or not allowed) */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiErrorDto"]; + }; + }; + /** @description Not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiErrorDto"]; + }; + }; + /** @description Someone changed it at the same time: retry */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiErrorDto"]; + }; + }; + /** @description Business rule (e.g. a transition the workflow forbids) */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiErrorDto"]; + }; + }; + }; + }; + IssuesController_unvote: { + parameters: { + query?: never; + header?: never; + path: { + /** @description Ticket id or key */ + issue: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["CommandResultDto"]; + }; + }; + /** @description Invalid input */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiErrorDto"]; + }; + }; + /** @description Missing or rejected Pireon token */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiErrorDto"]; + }; + }; + /** @description Not a member of the project (or not allowed) */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiErrorDto"]; + }; + }; + /** @description Not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiErrorDto"]; + }; + }; + /** @description Someone changed it at the same time: retry */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiErrorDto"]; + }; + }; + /** @description Business rule (e.g. a transition the workflow forbids) */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiErrorDto"]; + }; + }; + }; + }; + IssuesController_duplicate: { + parameters: { + query?: never; + header?: never; + path: { + /** @description Ticket id or key */ + issue: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + 201: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["CommandResultDto"]; + }; + }; + /** @description Invalid input */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiErrorDto"]; + }; + }; + /** @description Missing or rejected Pireon token */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiErrorDto"]; + }; + }; + /** @description Not a member of the project (or not allowed) */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiErrorDto"]; + }; + }; + /** @description Not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiErrorDto"]; + }; + }; + /** @description Someone changed it at the same time: retry */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiErrorDto"]; + }; + }; + /** @description Business rule (e.g. a transition the workflow forbids) */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiErrorDto"]; + }; + }; + }; + }; IssuesController_trashed: { parameters: { query?: never; @@ -5668,7 +6067,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["CommandResultDto"]; + "application/json": components["schemas"]["AttachmentResultDto"]; }; }; /** @description Invalid input */ @@ -6016,6 +6415,85 @@ export interface operations { }; }; }; + CommentsController_react: { + parameters: { + query?: never; + header?: never; + path: { + commentId: string; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["ReactToCommentDto"]; + }; + }; + responses: { + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["CommandResultDto"]; + }; + }; + /** @description Invalid input */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiErrorDto"]; + }; + }; + /** @description Missing or rejected Pireon token */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiErrorDto"]; + }; + }; + /** @description Not a member of the project (or not allowed) */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiErrorDto"]; + }; + }; + /** @description Not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiErrorDto"]; + }; + }; + /** @description Someone changed it at the same time: retry */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiErrorDto"]; + }; + }; + /** @description Business rule (e.g. a transition the workflow forbids) */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiErrorDto"]; + }; + }; + }; + }; ReleasesController_upcoming: { parameters: { query?: { @@ -6859,6 +7337,53 @@ export interface operations { }; }; }; + ExploreController_propose: { + parameters: { + query?: never; + header?: never; + path: { + /** @description Project id or key */ + project: string; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["ProposalDto"]; + }; + }; + responses: { + 201: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ProposalResultDto"]; + }; + }; + /** @description It does not take proposals */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Not a public project */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Too many from this address */ + 429: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; NotificationsController_mine: { parameters: { query?: { diff --git a/apps/mcp/src/app/tools/issues.resolver.ts b/apps/mcp/src/app/tools/issues.resolver.ts index 648bf55..8b96c65 100644 --- a/apps/mcp/src/app/tools/issues.resolver.ts +++ b/apps/mcp/src/app/tools/issues.resolver.ts @@ -19,6 +19,7 @@ const REMOVE = { const PRIORITY = z.enum(['LOWEST', 'LOW', 'MEDIUM', 'HIGH', 'CRITICAL']); const CATEGORY = z.enum(['TODO', 'IN_PROGRESS', 'QA', 'DONE', 'CANCELLED']); +const REACTION = z.enum(['👍', '👎', '😄', '🎉', '😕', '❤️', '🚀', '👀']); const LINK_TYPE = z.enum([ 'BLOCKS', 'DEPENDS_ON', @@ -242,6 +243,10 @@ export class IssuesResolver { author: c.deleted ? null : c.author.name, at: c.createdAt, body: c.deleted ? '(deleted; kept for its replies)' : c.body, + reactions: c.reactions.map((r) => ({ + emoji: r.emoji, + by: r.users.map((u) => u.name), + })), })) : undefined; const history = params.withHistory @@ -639,4 +644,70 @@ export class IssuesResolver { ), ); } + + @Tool({ + name: 'duplicate_issue', + description: + "A new ticket like this one: what it says (type, title, description, area, priority, labels, Figma, estimate, dates, parent, checklist steps unticked), not where it stands (first status, unassigned, no sprint, release, comments or files). Answers the copy's key.", + paramsSchema: z.object({ issue: issueRef }), + annotations: WRITE, + }) + duplicate({ issue }: { issue: string }, ctx: McpContext) { + return toolResult(() => + this.api.data( + this.api.as(ctx).POST('/api/issues/{issue}/duplicate', { + params: { path: { issue } }, + }), + ), + ); + } + + @Tool({ + name: 'react_to_comment', + description: + 'React to a comment (👍 👎 😄 🎉 😕 ❤️ 🚀 👀) or take the reaction back (on: false). Comment ids come with get_issue.', + paramsSchema: z.object({ + commentId: z.string().min(1), + emoji: REACTION, + on: z.boolean().default(true), + }), + annotations: { ...WRITE, idempotentHint: true }, + }) + react( + params: { + commentId: string; + emoji: z.infer; + on: boolean; + }, + ctx: McpContext, + ) { + const { commentId, ...body } = params; + return toolResult(() => + this.api.data( + this.api.as(ctx).POST('/api/comments/{commentId}/reactions', { + params: { path: { commentId } }, + body, + }), + ), + ); + } + + @Tool({ + name: 'vote_issue', + description: + 'Vote for a ticket (on) or take the vote back: anyone signed in on a public project, members on a private one. Votes say what people want done.', + paramsSchema: z.object({ issue: issueRef, on: z.boolean().default(true) }), + annotations: { ...WRITE, idempotentHint: true }, + }) + vote({ issue, on }: { issue: string; on: boolean }, ctx: McpContext) { + const client = this.api.as(ctx); + const options = { params: { path: { issue } } }; + return toolResult(() => + this.api.data( + on + ? client.PUT('/api/issues/{issue}/vote', options) + : client.DELETE('/api/issues/{issue}/vote', options), + ), + ); + } } diff --git a/apps/mcp/src/app/tools/summaries.ts b/apps/mcp/src/app/tools/summaries.ts index 7ec6263..bfdf45f 100644 --- a/apps/mcp/src/app/tools/summaries.ts +++ b/apps/mcp/src/app/tools/summaries.ts @@ -22,6 +22,9 @@ export const issueLine = (issue: Issue) => ({ release: issue.release?.name ?? null, sprint: issue.sprint?.name ?? null, parent: issue.parent?.key ?? null, + /** Open tickets it waits for. */ + blockedBy: issue.blockedBy.map((b) => b.key), + votes: issue.votes, storyPoints: issue.storyPoints, dueDate: issue.dueDate, labels: issue.labels, diff --git a/apps/web/src/app/app.routes.spec.ts b/apps/web/src/app/app.routes.spec.ts index da351a2..3bafe39 100644 --- a/apps/web/src/app/app.routes.spec.ts +++ b/apps/web/src/app/app.routes.spec.ts @@ -27,6 +27,8 @@ describe('appRoutes', () => { expect(project?.children?.map((route) => route.path)).toEqual([ '', 'board', + 'proponer', + 'list', 'issues/:issueKey', 'backlog', 'sprints', diff --git a/docs/01-vision-general.md b/docs/01-vision-general.md index 1b840b8..c79a6d7 100644 --- a/docs/01-vision-general.md +++ b/docs/01-vision-general.md @@ -2,45 +2,47 @@ ## Qué resuelve -| Necesidad | Cómo se resuelve | -| -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| 🐛 Bugs | Tickets de tipo `BUG` con prioridad, área y etiquetas | -| 🌍 Públicos | Un proyecto público se puede leer sin iniciar sesión (web, GraphQL y REST): tablero, tickets, comentarios, releases, actividad y estadísticas; «Explorar» los lista | -| 🗑️ Borrar | El propietario borra un proyecto confirmando su clave; tickets, comentarios, releases y enlaces desde otros proyectos se borran en cascada (sagas) y la clave queda libre | -| 🧩 Configuración | Cada proyecto tiene sus estados (con categoría, color y motivo obligatorio), transiciones, tipos de ticket y áreas; lo usado se archiva, no se borra | -| 🎨 Cambios de UI | Tipo `UI_CHANGE` con enlace al frame de Figma (validado contra `figma.com`) | -| ⚙️ Features | Tipo `FEATURE` siguiendo el workflow completo | -| 🧪 QA | Por defecto, `READY_FOR_QA → IN_QA → DONE / QA_FAILED`; fallar QA exige un motivo | -| 🚀 Releases | Versiones a las que se asignan tickets; no se publican con tickets sin terminar (salvo forzando) | -| 📝 Notas de versión | Borrador en Markdown con los tickets terminados por tipo, editable y copiable, también tras publicar | -| 👥 Asignaciones | Solo a miembros del proyecto; panel de carga por persona | -| 💬 Comentarios | Decisiones y explicaciones dentro del ticket, con respuestas y `@menciones`; el autor edita, el admin modera | -| 🔎 Vistas | El tablero se filtra por texto, persona (o sin asignar), tipo, prioridad, área y release; los filtros se guardan como vistas propias o compartidas con el proyecto | -| 🚦 WIP y carriles | Límite de trabajo en curso por estado (la columna se marca al pasarse) y tablero agrupable por persona, épica, prioridad o tipo | -| 🎲 Estimación | Puntos por ticket (escala 0-1-2-3-5-8-13-21) en la ficha, las tarjetas, las columnas y el backlog; velocidad por sprint y aviso si un sprint planificado supera la media | -| 🏃 Sprints | Iteraciones con fechas y objetivo, una en curso por proyecto, con burndown (tickets o puntos) y traspaso de lo pendiente al cerrar | -| 📅 Calendario | Los sprints mes a mes como franjas, con las releases y los vencimientos de cada día; se planifica un sprint pulsando su primer día y todo se descarga en .ics | -| 📋 Backlog | Lo pendiente de empezar, en el orden en que se va a coger; se reordena arrastrando y el tablero sigue ese orden | -| 🗑️ Papelera | Borrar un ticket lo manda a la papelera (quien lo abrió o un admin); se recupera durante 30 días y luego se borra del todo | -| ☑️ En bloque | Selecciona varios tickets del backlog y cámbiales a la vez estado, persona, sprint, prioridad o etiqueta | -| ⌨️ Atajos y búsqueda | Ctrl/⌘ K o / busca tickets y proyectos de todos tus proyectos; `g b`, `g k`, `g s`, `g r` navegan, `c` crea, `e` edita, `?` los lista | -| 🗺️ Hoja de ruta | Las épicas en el tiempo (fecha de inicio y límite), con los sprints y las releases como referencias | -| 🌐 Web del colectivo | La página de cada proyecto en pireon.dev enseña su hoja de ruta, versiones, sprint y tickets para recién llegados (`good-first-issue`) | -| 🧩 Desglose | Épicas → tickets → subtareas (tres niveles), con su progreso; y una checklist dentro de cada ticket para los pasos pequeños | -| 👀 Seguir | Cualquier miembro sigue los tickets que le interesan y los ve juntos en «Que sigo»; quien lo abre, lo tiene asignado o comenta, lo sigue solo | -| 🔔 Avisos | Campana con lo que te concierne (asignaciones, cambios de estado, QA fallido, comentarios, respuestas), en vivo y opcionalmente por correo | -| ⏰ Recordatorios | Aviso (y correo, si se quiere) el día antes, el mismo día y al vencer la fecha límite, a quien lo tiene y a quien lo sigue; las tarjetas marcan lo que vence | -| 📎 Adjuntos | Capturas, logs y vídeos en el ticket o bajo un comentario; arrastrar, elegir o pegar con Ctrl+V; miniaturas de las imágenes | -| 🔗 Relaciones | `BLOCKS`, `DEPENDS_ON`, `TESTS`, `DUPLICATES`, `RELATES_TO`, también entre proyectos (FE ↔ BE ↔ QA) | -| 🌿 Git | Webhook para GitHub, Gitea o GitLab: commits, ramas y pull requests que nombran un ticket (WEB-12) aparecen en su ficha | -| 🧾 Plantillas | Cada tipo de ticket puede traer una descripción inicial y una checklist que se aplican al crearlo | -| 🤖 Automatizaciones | Reglas «cuando… si… entonces…»: al crear, mover, asignar, comentar o fusionar una PR, mover, asignar, etiquetar, priorizar, comentar o meter en el sprint | -| 📡 Webhooks | Un POST firmado (HMAC-SHA256) a otro sistema cuando pasa algo: tickets, comentarios, releases, sprints; con prueba y último envío | -| 📦 Importar/exportar | Todos los tickets a CSV; importar un CSV propio o una exportación de Jira, con vista previa de lo que se va a crear | -| 🏠 Inicio | «Mi trabajo»: mis tickets en todos los proyectos, por categoría (QA fallidos primero), lo que espera QA, próximas releases e «Ir a…» por clave | -| 📊 Seguimiento | Panel con contadores, flujo por estado, el equipo con sus tickets abiertos (enlaza a su tablero), feed de actividad e historial por ticket | -| 📈 Estadísticas | Creados vs. resueltos, flujo acumulado, burnup de releases, tiempos de ciclo y entrega, tasa de fallo en QA y resueltos por persona | -| ⚡ Tiempo real | Tablero, comentarios, actividad, releases y membresías se actualizan solos (GraphQL subscriptions) | +| Necesidad | Cómo se resuelve | +| --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| 🐛 Bugs | Tickets de tipo `BUG` con prioridad, área y etiquetas | +| 🌍 Públicos | Un proyecto público se puede leer sin iniciar sesión (web, GraphQL y REST): tablero, tickets, comentarios, releases, actividad y estadísticas; «Explorar» los lista | +| 🗑️ Borrar | El propietario borra un proyecto confirmando su clave; tickets, comentarios, releases y enlaces desde otros proyectos se borran en cascada (sagas) y la clave queda libre | +| 🧩 Configuración | Cada proyecto tiene sus estados (con categoría, color y motivo obligatorio), transiciones, tipos de ticket y áreas; lo usado se archiva, no se borra | +| 🎨 Cambios de UI | Tipo `UI_CHANGE` con enlace al frame de Figma (validado contra `figma.com`) | +| ⚙️ Features | Tipo `FEATURE` siguiendo el workflow completo | +| 🧪 QA | Por defecto, `READY_FOR_QA → IN_QA → DONE / QA_FAILED`; fallar QA exige un motivo | +| 🚀 Releases | Versiones a las que se asignan tickets; no se publican con tickets sin terminar (salvo forzando) | +| 📝 Notas de versión | Borrador en Markdown con los tickets terminados por tipo, editable y copiable, también tras publicar | +| 👥 Asignaciones | Solo a miembros del proyecto; panel de carga por persona | +| 💬 Comentarios | Decisiones y explicaciones dentro del ticket, con formato (Markdown), capturas pegadas, respuestas, reacciones (👍 🎉…) y `@menciones`; el autor edita, el admin modera | +| 🔎 Vistas | El tablero se filtra por texto, persona (o sin asignar), tipo, prioridad, área y release; los filtros se guardan como vistas propias o compartidas con el proyecto | +| 📋 Lista | Todos los tickets en filas: ordenar por cualquier columna, filtrar, cambiar estado, prioridad o persona sin abrirlos, editar en bloque y duplicar | +| 🚦 WIP y carriles | Límite de trabajo en curso por estado (la columna se marca al pasarse) y tablero agrupable por persona, épica, prioridad o tipo | +| 🎲 Estimación | Puntos por ticket (escala 0-1-2-3-5-8-13-21) en la ficha, las tarjetas, las columnas y el backlog; velocidad por sprint y aviso si un sprint planificado supera la media | +| 🏃 Sprints | Iteraciones con fechas y objetivo, una en curso por proyecto, con burndown (tickets o puntos) y traspaso de lo pendiente al cerrar | +| 📅 Calendario | Los sprints mes a mes como franjas, con las releases y los vencimientos de cada día; se planifica un sprint pulsando su primer día y todo se descarga en .ics | +| 📋 Backlog | Lo pendiente de empezar, en el orden en que se va a coger; se reordena arrastrando y el tablero sigue ese orden | +| 🗑️ Papelera | Borrar un ticket lo manda a la papelera (quien lo abrió o un admin); se recupera durante 30 días y luego se borra del todo | +| ☑️ En bloque | Selecciona varios tickets del backlog y cámbiales a la vez estado, persona, sprint, prioridad o etiqueta | +| ⌨️ Atajos y búsqueda | Ctrl/⌘ K o / busca tickets y proyectos de todos tus proyectos; `g b`, `g k`, `g s`, `g r` navegan, `c` crea, `e` edita, `?` los lista | +| 🗺️ Hoja de ruta | Las épicas en el tiempo (fecha de inicio y límite), con los sprints y las releases como referencias | +| 🗳️ Propuestas y votos | Un proyecto público puede abrir un formulario para que cualquiera, sin cuenta, reporte un error o proponga una idea; quien tenga sesión vota lo que quiere | +| 🌐 Web del colectivo | La página de cada proyecto en pireon.dev enseña su hoja de ruta, versiones, sprint y tickets para recién llegados (`good-first-issue`) | +| 🧩 Desglose | Épicas → tickets → subtareas (tres niveles), con su progreso; y una checklist dentro de cada ticket para los pasos pequeños | +| 👀 Seguir | Cualquier miembro sigue los tickets que le interesan y los ve juntos en «Que sigo»; quien lo abre, lo tiene asignado o comenta, lo sigue solo | +| 🔔 Avisos | Campana con lo que te concierne (asignaciones, cambios de estado, QA fallido, comentarios, respuestas), en vivo y opcionalmente por correo | +| ⏰ Recordatorios | Aviso (y correo, si se quiere) el día antes, el mismo día y al vencer la fecha límite, a quien lo tiene y a quien lo sigue; las tarjetas marcan lo que vence | +| 📎 Adjuntos | Capturas, logs y vídeos en el ticket o bajo un comentario; arrastrar, elegir o pegar con Ctrl+V; miniaturas de las imágenes | +| 🔗 Relaciones | `BLOCKS`, `DEPENDS_ON`, `TESTS`, `DUPLICATES`, `RELATES_TO`, también entre proyectos (FE ↔ BE ↔ QA); lo que espera a otro ticket abierto sale marcado como «Bloqueado» | +| 🌿 Git | Webhook para GitHub, Gitea o GitLab: commits, ramas y pull requests que nombran un ticket (WEB-12) aparecen en su ficha | +| 🧾 Plantillas | Cada tipo de ticket puede traer una descripción inicial y una checklist que se aplican al crearlo | +| 🤖 Automatizaciones | Reglas «cuando… si… entonces…»: al crear, mover, asignar, comentar o fusionar una PR, mover, asignar, etiquetar, priorizar, comentar o meter en el sprint | +| 📡 Webhooks | Un POST firmado (HMAC-SHA256) a otro sistema cuando pasa algo: tickets, comentarios, releases, sprints; con prueba y último envío | +| 📦 Importar/exportar | Todos los tickets a CSV; importar un CSV propio o una exportación de Jira, con vista previa de lo que se va a crear | +| 🏠 Inicio | «Mi trabajo»: mis tickets en todos los proyectos, por categoría (QA fallidos primero), lo que espera QA, próximas releases e «Ir a…» por clave | +| 📊 Seguimiento | Panel con contadores, flujo por estado, el equipo con sus tickets abiertos (enlaza a su tablero), feed de actividad e historial por ticket | +| 📈 Estadísticas | Creados vs. resueltos, flujo acumulado, burnup de releases, tiempos de ciclo y entrega, tasa de fallo en QA y resueltos por persona | +| ⚡ Tiempo real | Tablero, comentarios, actividad, releases y membresías se actualizan solos (GraphQL subscriptions) | Los **usuarios no se gestionan aquí**: vienen del servidor de identidad **Pireon** ([Swagger](https://oauth.pireon.dev/api/documentation)). TaskStream gestiona proyectos, membresías y roles por diff --git a/docs/03-api.md b/docs/03-api.md index 7068532..b7328aa 100644 --- a/docs/03-api.md +++ b/docs/03-api.md @@ -56,6 +56,18 @@ historial, releases (progreso y burnup), actividad, seguimiento y estadísticas. miembros según su rol (sin token: 401; con token pero sin ser miembro: 403). Un usuario con sesión que no es miembro lee igual que un anónimo. Las subscriptions exigen sesión; con ella, también se pueden seguir proyectos públicos. +**Propuestas del público**: un proyecto público puede aceptar errores e ideas de cualquiera, sin cuenta +(`acceptsProposals`, en `updateProject` / `PATCH`). `POST /api/explore/projects/{project}/proposals` (`kind`: `BUG` o +`IDEA`, `title`, `description`, `author` opcional) crea un ticket con la etiqueta `propuesta`, a nombre de TaskStream, +en el primer estado, de tipo Bug o Feature (o el primer tipo activo). No se pide correo, porque quedaría a la vista. Contra +el spam, el campo `website` es una trampa (si llega relleno se responde como si nada y no se guarda) y cada dirección +envía como mucho 5 cada 15 minutos (429); el límite vive en memoria de cada instancia, así que con varias es +aproximado. La web tiene el formulario en `/p/{CLAVE}/proponer`, enlazado en la cabecera del proyecto. + +**Votos**: quien tenga sesión vota los tickets de un proyecto público, y los miembros los de uno privado +(`voteIssue(issueId, on)`, `PUT/DELETE /api/issues/{issue}/vote`). Cada ticket da `votes` y, en GraphQL, `voted` (si he +votado yo); la lista de quién votó no se publica. + `publicProjects` (GraphQL) y `GET /api/explore/projects` (REST, sin token) los listan. Al volver a privado, quien no es miembro vuelve a recibir _not found_. Los enlaces a tickets de otros proyectos solo se muestran si el visitante puede leer esos proyectos. @@ -150,6 +162,20 @@ stateDiagram-v2 que ser del mismo ticket. Quien escribió el comentario recibe un aviso (`REPLIED`). Un comentario borrado que tiene respuestas se queda, sin texto (`deleted: true`), para que el hilo se siga entendiendo, y desaparece con su última respuesta; no cuenta en `commentCount`. +- **Formato**: descripciones, comentarios y notas de versión se escriben en Markdown; la API los guarda tal cual y la web + los muestra limpiando el HTML (DOMPurify). Una imagen pegada se sube como adjunto y queda en el texto como + `![nombre](attachment:)`: la subida responde `attachmentId`, y la web la descarga con la sesión de quien lee, así + que sirve también en proyectos privados. +- **Reacciones**: 👍 👎 😄 🎉 😕 ❤️ 🚀 👀 en los comentarios (`reactToComment(commentId, emoji, on)`, + `POST /api/comments/{id}/reactions`); los miembros, también los lectores. Cada comentario da `reactions` con quién + eligió cada una. No generan actividad ni avisos. +- **Bloqueos**: un ticket espera a otro si ese otro lo bloquea (`BLOCKS`) o si él depende de ese otro (`DEPENDS_ON`), + mientras el otro no esté hecho ni cancelado. `blockedBy` lo calcula al leer (los enlaces no guardan el estado del + otro ticket), con una sola consulta por tablero o página. +- **Duplicar**: `duplicateIssue` / `POST /api/issues/{issue}/duplicate` copia lo que dice el ticket (tipo, título con + «(copia)», descripción, área, prioridad, etiquetas, Figma, estimación, fechas, épica y pasos de la checklist sin + marcar), no dónde está: la copia empieza en el primer estado, sin asignar, sin sprint, release, comentarios ni + adjuntos. - **Cambios de UI**: `figmaUrl` debe ser un enlace `https://…figma.com/…`. - **Adjuntos**: los suben los miembros (no los lectores), hasta `ATTACHMENTS_MAX_MB` (25 MB) por archivo y 50 por ticket; pueden ir en el ticket o bajo uno de sus comentarios (`commentId`). Quita uno quien lo subió o un admin. @@ -329,17 +355,17 @@ que funcionan también sin token. Todas devuelven `CommandResult { id, key, version }`. -| Ámbito | Mutations | -| ----------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Proyectos | `createProject`, `updateProject`, `updateProjectSettings`, `deleteProject(confirmKey)`, `addProjectMember`, `changeProjectMemberRole`, `removeProjectMember` | -| Tickets | `createIssue`, `updateIssue`, `changeIssueStatus`, `assignIssue`, `linkIssues`, `unlinkIssues`, `setIssueRelease`, `setIssueParent`, `rankIssue`, `addChecklistItem`, `updateChecklistItem`, `removeChecklistItem`, `watchIssue`, `unwatchIssue`, `removeAttachment` (subir: por REST) | -| Comentarios | `addComment`, `editComment`, `deleteComment` | -| Webhooks | `createWebhook` (devuelve el secreto), `updateWebhook`, `deleteWebhook`, `testWebhook` | -| Git | `addGitRepository` (devuelve su secreto), `rotateGitRepositorySecret`, `removeGitRepository` | -| Sprints | `createSprint`, `updateSprint`, `startSprint`, `closeSprint(carryOverToSprintId)`, `deleteSprint`, `setIssueSprint` | -| Vistas | `saveFilter(input)` (devuelve el id), `deleteSavedFilter(id)` | -| Avisos | `markNotificationsRead(ids)`, `updateNotificationSettings(email)` | -| Releases | `createRelease`, `updateRelease`, `publishRelease(force)`, `writeReleaseNotes`, `archiveRelease` | +| Ámbito | Mutations | +| ----------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Proyectos | `createProject`, `updateProject`, `updateProjectSettings`, `deleteProject(confirmKey)`, `addProjectMember`, `changeProjectMemberRole`, `removeProjectMember` | +| Tickets | `createIssue`, `updateIssue`, `changeIssueStatus`, `assignIssue`, `linkIssues`, `unlinkIssues`, `setIssueRelease`, `setIssueParent`, `rankIssue`, `addChecklistItem`, `updateChecklistItem`, `removeChecklistItem`, `watchIssue`, `unwatchIssue`, `removeAttachment` (subir: por REST), `duplicateIssue`, `voteIssue` | +| Comentarios | `addComment(replyTo)`, `editComment`, `deleteComment`, `reactToComment` | +| Webhooks | `createWebhook` (devuelve el secreto), `updateWebhook`, `deleteWebhook`, `testWebhook` | +| Git | `addGitRepository` (devuelve su secreto), `rotateGitRepositorySecret`, `removeGitRepository` | +| Sprints | `createSprint`, `updateSprint`, `startSprint`, `closeSprint(carryOverToSprintId)`, `deleteSprint`, `setIssueSprint` | +| Vistas | `saveFilter(input)` (devuelve el id), `deleteSavedFilter(id)` | +| Avisos | `markNotificationsRead(ids)`, `updateNotificationSettings(email)` | +| Releases | `createRelease`, `updateRelease`, `publishRelease(force)`, `writeReleaseNotes`, `archiveRelease` | ### Subscriptions @@ -536,23 +562,23 @@ Lo que cada usuario puede ver o cambiar depende de su rol en cada proyecto, como Proyectos y tickets se pueden indicar por **id o por clave** (`WEB`, `WEB-12`). -| Recurso | Rutas | -| ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| Usuarios | `GET /api/users/me`, `GET /api/users?search=`, `GET /api/users/{id}` | -| Proyectos | `GET/POST /api/projects`, `GET/PATCH/DELETE /api/projects/{project}` (`DELETE …?confirm=CLAVE`), `PUT …/settings`, `…/board`, `…/epics`, `…/stats`, `…/analytics?days=`, `…/activity`, `…/members` (POST, PATCH, DELETE) | -| Tickets | `GET /api/me/issues` (mi trabajo), `GET/POST /api/projects/{project}/issues`, `GET/PATCH /api/issues/{issue}`, `PUT …/status`, `PUT …/assignee`, `PUT …/release`, `PUT/DELETE …/watch`, `PUT …/parent`, `PUT …/rank`, `POST …/checklist`, `PATCH/DELETE …/checklist/{item}`, `POST/DELETE …/links`, `GET/POST …/comments`, `GET …/history` | -| Comentarios | `PATCH/DELETE /api/comments/{commentId}` | -| Sprints | `GET/POST /api/projects/{project}/sprints`, `GET/PATCH/DELETE /api/sprints/{sprint}`, `POST …/start`, `POST …/close`, `GET …/progress`, `…/burndown`, `…/issues`, `PUT /api/issues/{issue}/sprint` | -| Vistas | `GET/POST /api/projects/{project}/filters`, `DELETE /api/filters/{id}` | -| Avisos | `GET /api/me/notifications`, `POST /api/me/notifications/read`, `GET/PUT /api/me/notification-settings` | -| Adjuntos | `POST /api/issues/{issue}/attachments` (multipart: `file` y opcional `commentId`), `GET/DELETE /api/issues/{issue}/attachments/{id}` | -| Releases | `GET /api/me/releases` (próximas), `GET/POST /api/projects/{project}/releases`, `GET/PATCH /api/releases/{id}`, `PUT …/notes`, `GET …/notes/draft`, `…/progress`, `…/burnup`, `…/issues`, `POST …/publish`, `POST …/archive` | -| Explorar | `GET /api/explore/projects` (proyectos públicos, sin token) | -| Importar | `GET /api/projects/{project}/export.csv`, `POST /api/projects/{project}/import?dryRun=` (multipart `file`) | -| Webhooks | `GET /api/webhook-events`, `GET/POST /api/projects/{project}/webhooks`, `PATCH/DELETE /api/outgoing-webhooks/{id}`, `POST …/test` | -| Git | `GET /api/projects/{project}/git-integration`, `POST …/git-integration/repositories`, `POST …/repositories/{id}/secret`, `DELETE …/repositories/{id}`, `POST /api/webhooks/git/{project}` (lo llama el host de Git) | -| Explorar | `GET /api/explore/projects/{project}/showcase` (sin token, proyectos públicos): hoja de ruta, versiones, sprint en curso y tickets `good-first-issue` | -| Sistema | `GET /api/health`, `GET /api/auth/config`, `POST /api/auth/token`, `POST /api/webhooks/pireon` | +| Recurso | Rutas | +| ----------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Usuarios | `GET /api/users/me`, `GET /api/users?search=`, `GET /api/users/{id}` | +| Proyectos | `GET/POST /api/projects`, `GET/PATCH/DELETE /api/projects/{project}` (`DELETE …?confirm=CLAVE`), `PUT …/settings`, `…/board`, `…/epics`, `…/stats`, `…/analytics?days=`, `…/activity`, `…/members` (POST, PATCH, DELETE) | +| Tickets | `GET /api/me/issues` (mi trabajo), `GET/POST /api/projects/{project}/issues`, `GET/PATCH /api/issues/{issue}`, `PUT …/status`, `PUT …/assignee`, `PUT …/release`, `PUT/DELETE …/watch`, `PUT …/parent`, `PUT …/rank`, `POST …/checklist`, `PATCH/DELETE …/checklist/{item}`, `POST/DELETE …/links`, `GET/POST …/comments`, `GET …/history`, `POST /api/issues/{issue}/duplicate`, `PUT/DELETE …/vote` | +| Comentarios | `PATCH/DELETE /api/comments/{commentId}`, `POST …/reactions` | +| Sprints | `GET/POST /api/projects/{project}/sprints`, `GET/PATCH/DELETE /api/sprints/{sprint}`, `POST …/start`, `POST …/close`, `GET …/progress`, `…/burndown`, `…/issues`, `PUT /api/issues/{issue}/sprint` | +| Vistas | `GET/POST /api/projects/{project}/filters`, `DELETE /api/filters/{id}` | +| Avisos | `GET /api/me/notifications`, `POST /api/me/notifications/read`, `GET/PUT /api/me/notification-settings` | +| Adjuntos | `POST /api/issues/{issue}/attachments` (multipart: `file` y opcional `commentId`), `GET/DELETE /api/issues/{issue}/attachments/{id}` | +| Releases | `GET /api/me/releases` (próximas), `GET/POST /api/projects/{project}/releases`, `GET/PATCH /api/releases/{id}`, `PUT …/notes`, `GET …/notes/draft`, `…/progress`, `…/burnup`, `…/issues`, `POST …/publish`, `POST …/archive` | +| Explorar | `GET /api/explore/projects` (proyectos públicos, sin token) | +| Importar | `GET /api/projects/{project}/export.csv`, `POST /api/projects/{project}/import?dryRun=` (multipart `file`) | +| Webhooks | `GET /api/webhook-events`, `GET/POST /api/projects/{project}/webhooks`, `PATCH/DELETE /api/outgoing-webhooks/{id}`, `POST …/test` | +| Git | `GET /api/projects/{project}/git-integration`, `POST …/git-integration/repositories`, `POST …/repositories/{id}/secret`, `DELETE …/repositories/{id}`, `POST /api/webhooks/git/{project}` (lo llama el host de Git) | +| Explorar | `GET /api/explore/projects/{project}/showcase` (sin token, proyectos públicos): hoja de ruta con votos, versiones, sprint en curso, tickets `good-first-issue` y propuestas abiertas; `POST …/proposals` (sin token) | +| Sistema | `GET /api/health`, `GET /api/auth/config`, `POST /api/auth/token`, `POST /api/webhooks/pireon` | Los archivos van por REST porque GraphQL no está hecho para bytes; la lista de adjuntos de un ticket llega con el ticket (`attachments`, en GraphQL y en REST). La descarga sirve en línea solo imágenes, vídeo, audio, PDF y texto diff --git a/docs/04-cliente-web.md b/docs/04-cliente-web.md index 3946f7a..ea6d5a5 100644 --- a/docs/04-cliente-web.md +++ b/docs/04-cliente-web.md @@ -5,18 +5,18 @@ API repartida en `libs/web/*`. ## 4.1 Librerías -| Librería | Contenido | -| ----------------------------- | ------------------------------------------------------------------------------------------------------------------------------ | -| `web/shared/infrastructure` | Cliente Apollo (`provideGraphql`: HTTP + `graphql-ws`), `API_CONFIG`, puerto `AccessTokenSource` | -| `web/shared/ui` | Integración de `@pi/ui` (`providePiUi`), modo oscuro, iconos, `ToastService`, `DrawerService`, `AppShellComponent` | -| `web/identity/domain` | `Session`, `CurrentUser`, `AuthConfig` y puertos `AuthGateway`, `ProfileGateway`, `SessionStorage`, `AuthorizationFlow` | -| `web/identity/application` | `AuthFacade` (pública); por dentro `AuthStore` y eventos `authPageEvents`, `authApiEvents`, `sessionEvents` | -| `web/identity/infrastructure` | `/api/auth/*` (HTTP), `me` (GraphQL), `localStorage`, PKCE con Web Crypto; enlaza `AccessTokenSource` con la `AuthFacade` | -| `web/identity/presenters` | Página de login, callback de Pireon, `authGuard` / `guestGuard`, menú de usuario | -| `web/tracker/domain` | Modelos, enums, workflow y puertos (`ProjectsGateway`, `IssuesGateway`, `TrackerRealtimeGateway`…) | -| `web/tracker/application` | Facades `ProjectsFacade`, `ProjectFacade`, `BoardFacade`, `IssueFacade` y puerto `Notifications`; por dentro, stores y eventos | -| `web/tracker/infrastructure` | Adaptadores GraphQL con operaciones tipadas (codegen) | -| `web/tracker/presenters` | Páginas: proyectos, tablero, ticket, releases, seguimiento, actividad y miembros | +| Librería | Contenido | +| ----------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `web/shared/infrastructure` | Cliente Apollo (`provideGraphql`: HTTP + `graphql-ws`), `API_CONFIG`, puerto `AccessTokenSource` | +| `web/shared/ui` | Integración de `@pi/ui` (`providePiUi`), modo oscuro, iconos, `ToastService`, `DrawerService`, `AppShellComponent` | +| `web/identity/domain` | `Session`, `CurrentUser`, `AuthConfig` y puertos `AuthGateway`, `ProfileGateway`, `SessionStorage`, `AuthorizationFlow` | +| `web/identity/application` | `AuthFacade` (pública); por dentro `AuthStore` y eventos `authPageEvents`, `authApiEvents`, `sessionEvents` | +| `web/identity/infrastructure` | `/api/auth/*` (HTTP), `me` (GraphQL), `localStorage`, PKCE con Web Crypto; enlaza `AccessTokenSource` con la `AuthFacade` | +| `web/identity/presenters` | Página de login, callback de Pireon, `authGuard` / `guestGuard`, menú de usuario | +| `web/tracker/domain` | Modelos, enums, workflow y puertos (`ProjectsGateway`, `IssuesGateway`, `TrackerRealtimeGateway`…) | +| `web/tracker/application` | Facades `ProjectsFacade`, `ProjectFacade`, `BoardFacade`, `IssueFacade` y puerto `Notifications`; por dentro, stores y eventos | +| `web/tracker/infrastructure` | Adaptadores GraphQL con operaciones tipadas (codegen) | +| `web/tracker/presenters` | Páginas: proyectos, tablero, lista, ticket, propuestas, releases, seguimiento, actividad y miembros; `ts-markdown` (texto con formato, saneado con DOMPurify), `ts-bulk-bar`, `ts-vote` | ## 4.2 Estado: NgRx Signals con eventos @@ -109,15 +109,16 @@ Qué gana la página: - **Un sitio para la lógica de presentación**: abrir o refiltrar el tablero, buscar usuarios a partir de 2 caracteres… - **Tests sin plantilla**: la facade se prueba con gateways falsos (`facades.spec.ts`). -| Facade | Store | Ámbito | Responsabilidad | -| ---------------- | --------------- | ----------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `AuthFacade` | `AuthStore` | raíz | Sesión, usuario, login (PKCE o email y contraseña de Pireon), renovación del token, restaurar al arrancar | -| `ProjectsFacade` | `ProjectsStore` | raíz | Mis proyectos; se actualiza cuando me añaden o quitan (`myProjectsChanged`) | -| `HomeFacade` | `HomeStore` | raíz | «Mi trabajo» en la portada: mis tickets abiertos por categoría (QA fallidos primero), esperando QA y próximas releases; se recarga al volver a la pestaña | -| `ExploreFacade` | `ExploreStore` | raíz | Proyectos públicos («Explorar»), también sin sesión | -| `ProjectFacade` | `ProjectStore` | ruta `/p/:key` | Proyecto, miembros, stats, releases, actividad en vivo, búsqueda de usuarios, configuración (`workflow`, `saveSettings`) y estadísticas (`loadAnalytics`, `loadBurnup`) | -| `BoardFacade` | `BoardStore` | ruta `board` | Tablero kanban, filtros, movimiento optimista, nuevo ticket, cambios en vivo | -| `IssueFacade` | `IssueStore` | ruta `issues/:issueKey` | Ticket, comentarios en vivo, historial y todas sus acciones | +| Facade | Store | Ámbito | Responsabilidad | +| ---------------- | --------------- | ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `AuthFacade` | `AuthStore` | raíz | Sesión, usuario, login (PKCE o email y contraseña de Pireon), renovación del token, restaurar al arrancar | +| `ProjectsFacade` | `ProjectsStore` | raíz | Mis proyectos; se actualiza cuando me añaden o quitan (`myProjectsChanged`) | +| `HomeFacade` | `HomeStore` | raíz | «Mi trabajo» en la portada: mis tickets abiertos por categoría (QA fallidos primero), esperando QA y próximas releases; se recarga al volver a la pestaña | +| `ExploreFacade` | `ExploreStore` | raíz | Proyectos públicos («Explorar»), también sin sesión | +| `ProjectFacade` | `ProjectStore` | ruta `/p/:key` | Proyecto, miembros, stats, releases, actividad en vivo, búsqueda de usuarios, configuración (`workflow`, `saveSettings`) y estadísticas (`loadAnalytics`, `loadBurnup`) | +| `BoardFacade` | `BoardStore` | ruta `board` | Tablero kanban, filtros, movimiento optimista, nuevo ticket, cambios en vivo | +| `ListFacade` | `ListStore` | ruta `list` | Todos los tickets del proyecto en filas: filtros (enviados a la API), cambios de estado, prioridad y persona en la fila, edición en bloque; se recarga tras cada cambio propio y con los de otros | +| `IssueFacade` | `IssueStore` | ruta `issues/:issueKey` | Ticket, comentarios en vivo, historial y todas sus acciones | Las de ámbito de ruta se registran con `provideProjectFacade()`, `provideBoardFacade()` o `provideIssueFacade()` en los `providers` del componente de la página (store + facade) y desaparecen al salir (con sus subscriptions). Las páginas @@ -168,7 +169,7 @@ La librería de componentes de Pireon se instala desde su Nexus (scope `@pi`, co | Drawers y modales se abren con `MatDialog` | `DrawerService.open(título, template)` con `getDrawerConfigs` de la librería | | `pi-search-field` es un buscador plegable (un icono) | Para un campo de búsqueda normal se usa `pi-text-field` | -| `button` globales: `min-width`, padding y radio con selectores muy específicos | Los botones propios de la app usan `.ts-icon-button`; `pi-action-button size="w100"` necesita `box-sizing` (en `styles.scss`) | +| `button` globales: `min-width`, padding y radio con selectores muy específicos | Los botones propios de la app usan `.ts-icon-button`, o anulan esas reglas con `!important` (votos, reacciones); `pi-action-button size="w100"` necesita `box-sizing` (en `styles.scss`) | | Los campos pintan cualquier error que reciben, aunque no se hayan tocado | En el login, los errores se pasan solo tras salir del campo o intentar entrar (`(touch)`) | Componentes en uso: `pi-action-button`, `pi-icon-button`, `pi-icon`, `pi-note`, `pi-text-field`, `pi-email-field`, diff --git a/docs/09-mcp.md b/docs/09-mcp.md index 820c3a1..215595d 100644 --- a/docs/09-mcp.md +++ b/docs/09-mcp.md @@ -32,7 +32,7 @@ flowchart LR ## 9.2 Herramientas -54 herramientas, agrupadas por ámbito: +57 herramientas, agrupadas por ámbito: | Ámbito | Herramienta | Qué hace | | ------------ | ------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------- | @@ -60,6 +60,9 @@ flowchart LR | | `add_comment` / `edit_comment` / `delete_comment` | Comentar (o responder a un comentario), corregir o borrar | | | `link_issues` / `unlink_issues` | Relacionar tickets (`DEPENDS_ON`, `BLOCKS`, `TESTS`…) o quitar la relación | | | `watch_issue` | Seguir un ticket o dejar de seguirlo | +| | `vote_issue` | Votar un ticket o quitar el voto | +| | `duplicate_issue` | Crear otro ticket con lo mismo (sin estado, persona ni comentarios) | +| | `react_to_comment` | Reaccionar a un comentario (👍 🎉…) o quitar la reacción | | | `add_checklist_item` / `update_checklist_item` / `remove_checklist_item` | La lista de comprobación: añadir, marcar o reescribir, quitar | | Organización | `list_epics` | Épicas con el progreso de lo que cuelga de cada una | | | `set_issue_parent` | Colgar un ticket de una épica u otro ticket, o soltarlo | diff --git a/docs/README.md b/docs/README.md index 1668873..790adbc 100644 --- a/docs/README.md +++ b/docs/README.md @@ -17,6 +17,12 @@ tareas, QA), releases, comentarios y relaciones entre tickets, todo en tiempo re Cada librería de `libs/` tiene además su propio `README.md` con su responsabilidad y su contenido. +**Ideas para más adelante** + +- **Avisos a Discord, Slack o Telegram**: los webhooks salientes mandan JSON en bruto, que esos chats no muestran bien. + Una integración por canal (o un formato por destino en los webhooks) mandaría mensajes ya legibles: «Ana movió WEB-12 + a En revisión», con enlace. + **Empezar rápido** ```sh diff --git a/docs/TaskStream-Documentacion.docx b/docs/TaskStream-Documentacion.docx index e490e5b..87748d1 100644 Binary files a/docs/TaskStream-Documentacion.docx and b/docs/TaskStream-Documentacion.docx differ diff --git a/docs/TaskStream-Documentacion.pdf b/docs/TaskStream-Documentacion.pdf index fa83a72..63844d8 100644 Binary files a/docs/TaskStream-Documentacion.pdf and b/docs/TaskStream-Documentacion.pdf differ diff --git a/libs/api/tracker/application/src/index.ts b/libs/api/tracker/application/src/index.ts index e48a18d..85cfcfb 100644 --- a/libs/api/tracker/application/src/index.ts +++ b/libs/api/tracker/application/src/index.ts @@ -7,6 +7,7 @@ export * from './lib/comments.service'; export * from './lib/releases.service'; export * from './lib/changes.service'; export * from './lib/workflows.service'; +export * from './lib/blockers.service'; export * from './lib/notifications.service'; export * from './lib/notifications'; export * from './lib/saved-filters.service'; diff --git a/libs/api/tracker/application/src/lib/blockers.service.spec.ts b/libs/api/tracker/application/src/lib/blockers.service.spec.ts new file mode 100644 index 0000000..791dc1a --- /dev/null +++ b/libs/api/tracker/application/src/lib/blockers.service.spec.ts @@ -0,0 +1,78 @@ +import { + IssueLinkType, + IssueReadModel, + StatusCategory, +} from '@task-stream/api/tracker/domain'; +import { BlockersService } from './blockers.service'; +import { FindIssuesRepository } from './ports/find-issues.repository'; + +const issue = ( + id: string, + statusCategory = StatusCategory.TODO, + links: IssueReadModel['links'] = [], +) => + ({ + id, + key: `WEB-${id}`, + title: `Ticket ${id}`, + statusCategory, + trashedAt: null, + links, + }) as unknown as IssueReadModel; + +describe('BlockersService', () => { + const store = new Map( + [ + issue('2'), + issue('3', StatusCategory.DONE), + issue('4', StatusCategory.IN_PROGRESS), + issue('5'), + ].map((i) => [i.id, i]), + ); + const queries: string[][] = []; + const service = new BlockersService({ + findByIds: async (ids: string[]) => { + queries.push(ids); + return ids.map((id) => store.get(id)).filter(Boolean); + }, + } as unknown as FindIssuesRepository); + const link = ( + type: IssueLinkType, + direction: 'INWARD' | 'OUTWARD', + id: string, + ) => ({ type, direction, issueId: id, issueKey: `WEB-${id}` }); + + beforeEach(() => (queries.length = 0)); + + it('is waiting on what blocks it and what it depends on, while open', async () => { + const one = issue('1', StatusCategory.TODO, [ + link(IssueLinkType.BLOCKS, 'INWARD', '2'), // 2 blocks 1 + link(IssueLinkType.DEPENDS_ON, 'OUTWARD', '3'), // 1 depends on 3 (done) + link(IssueLinkType.DEPENDS_ON, 'OUTWARD', '4'), // 1 depends on 4 + link(IssueLinkType.BLOCKS, 'OUTWARD', '5'), // 1 blocks 5: not a blocker + link(IssueLinkType.RELATES_TO, 'OUTWARD', '2'), + ]); + expect((await service.blockedBy(one)).map((b) => b.key)).toEqual([ + 'WEB-2', + 'WEB-4', + ]); + }); + + it('asks once for the tickets of one moment (a board)', async () => { + const card = (id: string, blocker: string) => + issue(id, StatusCategory.TODO, [ + link(IssueLinkType.DEPENDS_ON, 'OUTWARD', blocker), + ]); + const results = await Promise.all([ + service.blockedBy(card('10', '2')), + service.blockedBy(card('11', '4')), + service.blockedBy(issue('12')), + ]); + expect(results.map((r) => r.map((b) => b.key))).toEqual([ + ['WEB-2'], + ['WEB-4'], + [], + ]); + expect(queries).toEqual([['2', '4']]); + }); +}); diff --git a/libs/api/tracker/application/src/lib/blockers.service.ts b/libs/api/tracker/application/src/lib/blockers.service.ts new file mode 100644 index 0000000..0bf3253 --- /dev/null +++ b/libs/api/tracker/application/src/lib/blockers.service.ts @@ -0,0 +1,86 @@ +import { Injectable } from '@nestjs/common'; +import { + IssueLinkType, + IssueReadModel, + StatusCategory, +} from '@task-stream/api/tracker/domain'; +import { FindIssuesRepository } from './ports/find-issues.repository'; + +/** A ticket another one waits for. */ +export interface Blocker { + id: string; + key: string; + title: string; +} + +const FINISHED = new Set([ + StatusCategory.DONE, + StatusCategory.CANCELLED, +]); + +/** + * What a ticket waits for: the tickets that block it and the ones it + * depends on, while they are open. Links keep no status, so it is worked + * out when reading; the lookups of one moment (a board, a page of a list) + * go to the read model as one query, not one per ticket. + */ +@Injectable() +export class BlockersService { + private batch: { + ids: Set; + result: Promise>; + } | null = null; + + constructor(private readonly findIssues: FindIssuesRepository) {} + + async blockedBy(issue: IssueReadModel): Promise { + const ids = blockerIdsOf(issue); + if (!ids.length) return []; + const found = await this.load(ids); + return ids + .map((id) => found.get(id)) + .filter( + (blocker): blocker is IssueReadModel => + !!blocker && + !blocker.trashedAt && + !FINISHED.has(blocker.statusCategory), + ) + .map(({ id, key, title }) => ({ id, key, title })); + } + + private load(ids: string[]): Promise> { + if (!this.batch) { + const pending = new Set(); + const result = new Promise>( + (resolve, reject) => + setImmediate(() => { + this.batch = null; + this.findIssues + .findByIds([...pending]) + .then((issues) => resolve(new Map(issues.map((i) => [i.id, i])))) + .catch(reject); + }), + ); + this.batch = { ids: pending, result }; + } + for (const id of ids) this.batch.ids.add(id); + return this.batch.result; + } +} + +/** "X blocks this" and "this depends on X": X is what it waits for. */ +export function blockerIdsOf(issue: IssueReadModel): string[] { + return [ + ...new Set( + (issue.links ?? []) + .filter( + (link) => + (link.type === IssueLinkType.BLOCKS && + link.direction === 'INWARD') || + (link.type === IssueLinkType.DEPENDS_ON && + link.direction === 'OUTWARD'), + ) + .map((link) => link.issueId), + ), + ]; +} diff --git a/libs/api/tracker/application/src/lib/commands/attach-file.command-handler.ts b/libs/api/tracker/application/src/lib/commands/attach-file.command-handler.ts index 620277d..31d9fdd 100644 --- a/libs/api/tracker/application/src/lib/commands/attach-file.command-handler.ts +++ b/libs/api/tracker/application/src/lib/commands/attach-file.command-handler.ts @@ -2,8 +2,8 @@ import { randomUUID } from 'node:crypto'; import { CommandHandler, ICommandHandler } from '@nestjs/cqrs'; import { BusinessRuleError } from '@task-stream/api/shared/domain'; import { AttachmentStorage, attachmentKey } from '../ports/attachment-storage'; -import { AttachFileCommand } from './attach-file.command'; -import { CommandResult, ack } from './command-result'; +import { AttachFileCommand, AttachmentResult } from './attach-file.command'; +import { ack } from './command-result'; import { WriteAccess } from './write-access'; /** @@ -19,7 +19,7 @@ export class AttachFileCommandHandler private readonly storage: AttachmentStorage, ) {} - async execute(command: AttachFileCommand): Promise { + async execute(command: AttachFileCommand): Promise { const { issue } = await this.access.issueForContributor( command.issueId, command.actorId, @@ -52,6 +52,7 @@ export class AttachFileCommandHandler await this.storage.remove(key); throw error; } - return ack(issue); + // The id lets a client point at the file, e.g. an image inside a comment. + return { ...ack(issue), attachmentId: id }; } } diff --git a/libs/api/tracker/application/src/lib/commands/attach-file.command.ts b/libs/api/tracker/application/src/lib/commands/attach-file.command.ts index 97ab9a8..7f28152 100644 --- a/libs/api/tracker/application/src/lib/commands/attach-file.command.ts +++ b/libs/api/tracker/application/src/lib/commands/attach-file.command.ts @@ -7,7 +7,12 @@ export interface IncomingFile { content: Buffer; } -export class AttachFileCommand extends Command { +/** The ticket's acknowledgement, and the id of the file now on it. */ +export interface AttachmentResult extends CommandResult { + attachmentId: string; +} + +export class AttachFileCommand extends Command { constructor( public readonly actorId: string, public readonly issueId: string, diff --git a/libs/api/tracker/application/src/lib/commands/command-handlers.ts b/libs/api/tracker/application/src/lib/commands/command-handlers.ts index 7015e2c..3975106 100644 --- a/libs/api/tracker/application/src/lib/commands/command-handlers.ts +++ b/libs/api/tracker/application/src/lib/commands/command-handlers.ts @@ -1,3 +1,7 @@ +import { DuplicateIssueCommandHandler } from './duplicate-issue.command-handler'; +import { ReactToCommentCommandHandler } from './react-to-comment.command-handler'; +import { VoteIssueCommandHandler } from './vote-issue.command-handler'; +import { SubmitProposalCommandHandler } from './submit-proposal.command-handler'; import { CreateProjectCommandHandler } from './create-project.command-handler'; import { UpdateProjectCommandHandler } from './update-project.command-handler'; import { UpdateProjectSettingsCommandHandler } from './update-project-settings.command-handler'; @@ -42,6 +46,10 @@ import { } from './change-checklist.command-handler'; export const COMMAND_HANDLERS = [ + SubmitProposalCommandHandler, + VoteIssueCommandHandler, + ReactToCommentCommandHandler, + DuplicateIssueCommandHandler, CreateProjectCommandHandler, UpdateProjectCommandHandler, UpdateProjectSettingsCommandHandler, diff --git a/libs/api/tracker/application/src/lib/commands/commands.spec.ts b/libs/api/tracker/application/src/lib/commands/commands.spec.ts index 2b16630..f2bd045 100644 --- a/libs/api/tracker/application/src/lib/commands/commands.spec.ts +++ b/libs/api/tracker/application/src/lib/commands/commands.spec.ts @@ -16,6 +16,7 @@ import { Issue, IssueStatus, Project, + IssuePriority, IssueType, ProjectRole, TRACKER_FACTORIES, @@ -74,6 +75,11 @@ import { ReleaseNamesRepository } from '../ports/release-names.repository'; import { UserDirectory } from '../ports/user-directory'; import { AttachmentStorage } from '../ports/attachment-storage'; import { AddCommentCommand } from './add-comment.command'; +import { DuplicateIssueCommand } from './duplicate-issue.command'; +import { ReactToCommentCommand } from './react-to-comment.command'; +import { UpdateProjectCommand } from './update-project.command'; +import { SubmitProposalCommand } from './submit-proposal.command'; +import { VoteIssueCommand } from './vote-issue.command'; import { AddProjectMemberCommand } from './add-project-member.command'; import { AssignIssueCommand } from './assign-issue.command'; import { AttachFileCommand } from './attach-file.command'; @@ -97,6 +103,10 @@ import { FindProjectsRepository } from '../ports/find-projects.repository'; async function setup() { const store = new InMemoryEventStore(); + const projectViews = new Map< + string, + { id: string; key: string; isPublic: boolean; acceptsProposals: boolean } + >(); // The project's Git repositories, as Mongo would keep them. const gitRepositories = new Map(); const git: GitIntegrationsRepository = { @@ -129,7 +139,13 @@ async function setup() { ReadAccess, { provide: FindProjectsRepository, - useValue: { findRole: async () => null, findById: async () => null }, + // Read-model lookups: projects are added by the tests that need them. + useValue: { + findRole: async () => null, + findById: async (id: string) => projectViews.get(id) ?? null, + findByKey: async (key: string) => + [...projectViews.values()].find((p) => p.key === key) ?? null, + }, }, { provide: GitIntegrationsRepository, useValue: git }, AggregateRehydrator, @@ -177,6 +193,7 @@ async function setup() { sprints, keys, git, + projectViews, run, rehydrator: moduleRef.get(AggregateRehydrator), }; @@ -832,6 +849,133 @@ describe('tracker commands (event sourced)', () => { expect(rebuilt.deleted).toBe(true); }); + it('duplicates what a ticket says, not where it stands', async () => { + const { run, rehydrator } = await setup(); + const projectId = await projectWithTeam(run); + const original = await run( + new CreateIssueCommand( + 'dev', + projectId, + IssueType.BUG, + 'Pago roto', + { + description: 'Falla en Safari', + priority: IssuePriority.HIGH, + labels: ['pagos'], + storyPoints: 3, + }, + 'qa', + ), + ); + await run(new AddChecklistItemCommand('dev', original.id, 'Reproducir')); + + const copy = await run(new DuplicateIssueCommand('qa', original.id)); + expect(copy.key).not.toBe(original.key); + const issue = await rehydrator.rehydrate(copy.id, Issue); + expect(issue).toMatchObject({ + title: 'Pago roto (copia)', + description: 'Falla en Safari', + priority: IssuePriority.HIGH, + labels: ['pagos'], + storyPoints: 3, + assigneeId: null, + reporterId: 'qa', + }); + expect(issue.checklist.map((s) => [s.text, s.done])).toEqual([ + ['Reproducir', false], + ]); + await expect( + run(new DuplicateIssueCommand('pm', original.id)), + ).rejects.toThrow(ForbiddenError); + }); + + it('takes reactions from members, once each, viewers included', async () => { + const { run, rehydrator } = await setup(); + const projectId = await projectWithTeam(run); + const issue = await run( + new CreateIssueCommand('dev', projectId, IssueType.TASK, 'Spike', {}), + ); + const comment = await run(new AddCommentCommand('dev', issue.id, 'Redis')); + await run(new ReactToCommentCommand('qa', comment.id, '👍', true)); + await run(new ReactToCommentCommand('pm', comment.id, '👍', true)); + await run(new ReactToCommentCommand('pm', comment.id, '👍', true)); + await run(new ReactToCommentCommand('dev', comment.id, '🎉', true)); + await run(new ReactToCommentCommand('dev', comment.id, '🎉', false)); + expect((await rehydrator.rehydrate(comment.id, Comment)).reactions).toEqual( + { '👍': ['qa', 'pm'] }, + ); + await expect( + run(new ReactToCommentCommand('qa', comment.id, '💩', true)), + ).rejects.toThrow(ValidationError); + await expect( + run(new ReactToCommentCommand('stranger', comment.id, '👍', true)), + ).rejects.toThrow(ForbiddenError); + }); + + it('takes votes from members, and from anyone once it is public', async () => { + const { run, rehydrator } = await setup(); + const projectId = await projectWithTeam(run); + const issue = await run( + new CreateIssueCommand( + 'dev', + projectId, + IssueType.FEATURE, + 'Modo oscuro', + {}, + ), + ); + await run(new VoteIssueCommand('pm', issue.id, true)); + await run(new VoteIssueCommand('pm', issue.id, true)); + await expect( + run(new VoteIssueCommand('stranger', issue.id, true)), + ).rejects.toThrow(ForbiddenError); + + await run(new UpdateProjectCommand('owner', projectId, { isPublic: true })); + await run(new VoteIssueCommand('stranger', issue.id, true)); + await run(new VoteIssueCommand('pm', issue.id, false)); + expect((await rehydrator.rehydrate(issue.id, Issue)).voterIds).toEqual([ + 'stranger', + ]); + }); + + it('turns a proposal into a ticket, only where the project takes them', async () => { + const { run, rehydrator, projectViews } = await setup(); + const projectId = await projectWithTeam(run); + const view = { + id: projectId, + key: 'TS', + isPublic: true, + acceptsProposals: false, + }; + projectViews.set(projectId, view); + const propose = () => + run( + new SubmitProposalCommand( + 'ts', + 'BUG', + 'No carga en Firefox', + 'Pantalla en blanco', + 'Lucía', + ), + ); + await expect(propose()).rejects.toThrow(ForbiddenError); + + view.acceptsProposals = true; + const result = await propose(); + const issue = await rehydrator.rehydrate(result.id, Issue); + expect(issue).toMatchObject({ + title: 'No carga en Firefox', + type: IssueType.BUG, + labels: ['propuesta'], + reporterId: 'system', + }); + expect(issue.description).toContain('Pantalla en blanco'); + expect(issue.description).toContain('por Lucía'); + + view.isPublic = false; + await expect(propose()).rejects.toThrow(NotFoundError); + }); + it('answers comments one level deep, on the same ticket', async () => { const { run, rehydrator } = await setup(); const projectId = await projectWithTeam(run); diff --git a/libs/api/tracker/application/src/lib/commands/create-issue.command-handler.ts b/libs/api/tracker/application/src/lib/commands/create-issue.command-handler.ts index 922f543..45f57b5 100644 --- a/libs/api/tracker/application/src/lib/commands/create-issue.command-handler.ts +++ b/libs/api/tracker/application/src/lib/commands/create-issue.command-handler.ts @@ -1,6 +1,10 @@ import { randomUUID } from 'node:crypto'; import { CommandHandler, EventPublisher, ICommandHandler } from '@nestjs/cqrs'; -import { IssueFactory, assertCanNest } from '@task-stream/api/tracker/domain'; +import { + IssueFactory, + SYSTEM_ACTOR_ID, + assertCanNest, +} from '@task-stream/api/tracker/domain'; import { IssueNumbersRepository } from '../ports/issue-numbers.repository'; import { CommandResult, ack } from './command-result'; import { CreateIssueCommand } from './create-issue.command'; @@ -21,7 +25,10 @@ export class CreateIssueCommandHandler async execute(command: CreateIssueCommand): Promise { const project = await this.access.project(command.projectId); - project.assertCanContribute(command.actorId); + // TaskStream itself (proposals from the public form) is no member; only + // internal commands act as it, never a request from outside. + if (command.actorId !== SYSTEM_ACTOR_ID) + project.assertCanContribute(command.actorId); // Before taking a number: an invalid type or area must not burn one. const workflow = project.workflow; workflow.assertActiveType(command.type); diff --git a/libs/api/tracker/application/src/lib/commands/duplicate-issue.command-handler.ts b/libs/api/tracker/application/src/lib/commands/duplicate-issue.command-handler.ts new file mode 100644 index 0000000..afc58d1 --- /dev/null +++ b/libs/api/tracker/application/src/lib/commands/duplicate-issue.command-handler.ts @@ -0,0 +1,61 @@ +import { CommandBus, CommandHandler, ICommandHandler } from '@nestjs/cqrs'; +import { AddChecklistItemCommand } from './change-checklist.command'; +import { CommandResult } from './command-result'; +import { CreateIssueCommand } from './create-issue.command'; +import { DuplicateIssueCommand } from './duplicate-issue.command'; +import { WriteAccess } from './write-access'; + +/** + * Copies what a ticket says (type, title, description, area, priority, + * labels, Figma, estimate, dates, parent and checklist steps, unticked), + * not where it stands: the copy starts in the first status, unassigned, + * out of sprints and releases, without comments or files. Created through + * the usual command, so the same rules and events apply. + */ +@CommandHandler(DuplicateIssueCommand) +export class DuplicateIssueCommandHandler + implements ICommandHandler +{ + constructor( + private readonly access: WriteAccess, + private readonly commandBus: CommandBus, + ) {} + + async execute(command: DuplicateIssueCommand): Promise { + const { issue } = await this.access.issueForContributor( + command.issueId, + command.actorId, + ); + const copy: CommandResult = await this.commandBus.execute( + new CreateIssueCommand( + command.actorId, + issue.projectId, + issue.type, + `${issue.title} (copia)`.slice(0, 255), + { + description: issue.description, + area: issue.area, + priority: issue.priority, + labels: issue.labels, + figmaUrl: issue.figmaUrl, + storyPoints: issue.storyPoints, + startDate: issue.startDate, + dueDate: issue.dueDate, + }, + null, + null, + issue.parentId, + null, + // The original's text is the content, not the type's template. + false, + ), + ); + let result = copy; + for (const step of issue.checklist) { + result = await this.commandBus.execute( + new AddChecklistItemCommand(command.actorId, copy.id, step.text), + ); + } + return { ...result, key: copy.key }; + } +} diff --git a/libs/api/tracker/application/src/lib/commands/duplicate-issue.command.ts b/libs/api/tracker/application/src/lib/commands/duplicate-issue.command.ts new file mode 100644 index 0000000..f7dcc89 --- /dev/null +++ b/libs/api/tracker/application/src/lib/commands/duplicate-issue.command.ts @@ -0,0 +1,12 @@ +import { Command } from '@nestjs/cqrs'; +import { CommandResult } from './command-result'; + +/** A new ticket like this one, to start from: the copy's key in the result. */ +export class DuplicateIssueCommand extends Command { + constructor( + public readonly actorId: string, + public readonly issueId: string, + ) { + super(); + } +} diff --git a/libs/api/tracker/application/src/lib/commands/index.ts b/libs/api/tracker/application/src/lib/commands/index.ts index f997645..45dc9cf 100644 --- a/libs/api/tracker/application/src/lib/commands/index.ts +++ b/libs/api/tracker/application/src/lib/commands/index.ts @@ -6,6 +6,11 @@ export * from './assign-issue.command'; export * from './change-issue-status.command'; export * from './change-project-member-role.command'; export * from './create-issue.command'; +export * from './duplicate-issue.command'; +export * from './react-to-comment.command'; +export * from './vote-issue.command'; +export * from './submit-proposal.command'; +export { PROPOSAL_LABEL } from './submit-proposal.command-handler'; export * from './create-project.command'; export * from './create-release.command'; export * from './delete-comment.command'; diff --git a/libs/api/tracker/application/src/lib/commands/react-to-comment.command-handler.ts b/libs/api/tracker/application/src/lib/commands/react-to-comment.command-handler.ts new file mode 100644 index 0000000..c2becf9 --- /dev/null +++ b/libs/api/tracker/application/src/lib/commands/react-to-comment.command-handler.ts @@ -0,0 +1,25 @@ +import { CommandHandler, ICommandHandler } from '@nestjs/cqrs'; +import { ForbiddenError } from '@task-stream/api/shared/domain'; +import { CommandResult, ack } from './command-result'; +import { ReactToCommentCommand } from './react-to-comment.command'; +import { WriteAccess } from './write-access'; + +/** Reacting is for members, viewers included: reading is enough to agree. */ +@CommandHandler(ReactToCommentCommand) +export class ReactToCommentCommandHandler + implements ICommandHandler +{ + constructor(private readonly access: WriteAccess) {} + + async execute(command: ReactToCommentCommand): Promise { + const comment = await this.access.comment(command.commentId); + const project = await this.access.project(comment.projectId); + if (!project.isMember(command.actorId)) + throw new ForbiddenError( + `You are not a member of project ${project.key}`, + ); + comment.react(command.actorId, command.emoji, command.on); + await comment.commitAndWait(); + return ack(comment); + } +} diff --git a/libs/api/tracker/application/src/lib/commands/react-to-comment.command.ts b/libs/api/tracker/application/src/lib/commands/react-to-comment.command.ts new file mode 100644 index 0000000..f9eda9d --- /dev/null +++ b/libs/api/tracker/application/src/lib/commands/react-to-comment.command.ts @@ -0,0 +1,14 @@ +import { Command } from '@nestjs/cqrs'; +import { CommandResult } from './command-result'; + +/** Adds (`on`) or takes back one's reaction (👍…) on a comment. */ +export class ReactToCommentCommand extends Command { + constructor( + public readonly actorId: string, + public readonly commentId: string, + public readonly emoji: string, + public readonly on: boolean, + ) { + super(); + } +} diff --git a/libs/api/tracker/application/src/lib/commands/submit-proposal.command-handler.ts b/libs/api/tracker/application/src/lib/commands/submit-proposal.command-handler.ts new file mode 100644 index 0000000..d569cf4 --- /dev/null +++ b/libs/api/tracker/application/src/lib/commands/submit-proposal.command-handler.ts @@ -0,0 +1,82 @@ +import { CommandBus, CommandHandler, ICommandHandler } from '@nestjs/cqrs'; +import { + ForbiddenError, + NotFoundError, + assertThat, +} from '@task-stream/api/shared/domain'; +import { + IssuePriority, + SYSTEM_ACTOR_ID, +} from '@task-stream/api/tracker/domain'; +import { FindProjectsRepository } from '../ports/find-projects.repository'; +import { CommandResult } from './command-result'; +import { CreateIssueCommand } from './create-issue.command'; +import { ProposalKind, SubmitProposalCommand } from './submit-proposal.command'; +import { WriteAccess } from './write-access'; + +/** The label every proposal carries, for the team to find and sort them. */ +export const PROPOSAL_LABEL = 'propuesta'; + +/** Preferred ticket type of each kind, when the project has it active. */ +const TYPE_OF: Record = { BUG: 'BUG', IDEA: 'FEATURE' }; + +/** + * Only a public project that takes proposals accepts one. It is opened by + * TaskStream (nobody signed in), in the first status, as a Bug or a Feature + * (or the first active type if the project has neither), and signed with + * the name they gave, if any. + */ +@CommandHandler(SubmitProposalCommand) +export class SubmitProposalCommandHandler + implements ICommandHandler +{ + constructor( + private readonly findProjects: FindProjectsRepository, + private readonly access: WriteAccess, + private readonly commandBus: CommandBus, + ) {} + + async execute(command: SubmitProposalCommand): Promise { + const found = + (await this.findProjects.findById(command.project)) ?? + (await this.findProjects.findByKey(command.project.toUpperCase())); + if (!found?.isPublic) throw new NotFoundError('Project', command.project); + if (!found.acceptsProposals) + throw new ForbiddenError(`${found.key} does not take proposals`); + + const title = command.title.trim(); + assertThat( + title.length >= 3 && title.length <= 150, + 'A proposal needs a title of 3 to 150 characters', + ); + const text = command.description.trim(); + assertThat(text.length <= 5000, 'A proposal is 5000 characters at most'); + + const project = await this.access.project(found.id); + const active = project.settings.issueTypes.filter((t) => !t.archived); + const type = + active.find((t) => t.id === TYPE_OF[command.kind])?.id ?? active[0]?.id; + const author = command.author?.trim().slice(0, 80); + const signature = `_Propuesta enviada desde el formulario público${author ? ` por ${author}` : ''}._`; + + return this.commandBus.execute( + new CreateIssueCommand( + SYSTEM_ACTOR_ID, + project.id, + type, + title, + { + description: text ? `${text}\n\n${signature}` : signature, + labels: [PROPOSAL_LABEL], + priority: IssuePriority.MEDIUM, + }, + null, + null, + null, + null, + // What they wrote is the content, not the type's template. + false, + ), + ); + } +} diff --git a/libs/api/tracker/application/src/lib/commands/submit-proposal.command.ts b/libs/api/tracker/application/src/lib/commands/submit-proposal.command.ts new file mode 100644 index 0000000..3e63c41 --- /dev/null +++ b/libs/api/tracker/application/src/lib/commands/submit-proposal.command.ts @@ -0,0 +1,22 @@ +import { Command } from '@nestjs/cqrs'; +import { CommandResult } from './command-result'; + +export type ProposalKind = 'BUG' | 'IDEA'; + +/** + * A bug report or an idea from anyone, through a public project's form: + * it becomes a ticket labelled `propuesta`, for the team to look at. + */ +export class SubmitProposalCommand extends Command { + constructor( + /** Project id or key. */ + public readonly project: string, + public readonly kind: ProposalKind, + public readonly title: string, + public readonly description: string, + /** How they sign it, if they want to: shown in the ticket. */ + public readonly author: string | null, + ) { + super(); + } +} diff --git a/libs/api/tracker/application/src/lib/commands/update-project.command.ts b/libs/api/tracker/application/src/lib/commands/update-project.command.ts index 3a61f60..6c5e4e7 100644 --- a/libs/api/tracker/application/src/lib/commands/update-project.command.ts +++ b/libs/api/tracker/application/src/lib/commands/update-project.command.ts @@ -9,6 +9,7 @@ export class UpdateProjectCommand extends Command { name?: string; description?: string | null; isPublic?: boolean; + acceptsProposals?: boolean; }, ) { super(); diff --git a/libs/api/tracker/application/src/lib/commands/vote-issue.command-handler.ts b/libs/api/tracker/application/src/lib/commands/vote-issue.command-handler.ts new file mode 100644 index 0000000..d1f1873 --- /dev/null +++ b/libs/api/tracker/application/src/lib/commands/vote-issue.command-handler.ts @@ -0,0 +1,33 @@ +import { CommandHandler, ICommandHandler } from '@nestjs/cqrs'; +import { + BusinessRuleError, + ForbiddenError, +} from '@task-stream/api/shared/domain'; +import { CommandResult, ack } from './command-result'; +import { VoteIssueCommand } from './vote-issue.command'; +import { WriteAccess } from './write-access'; + +/** + * Anyone signed in votes on a public project's tickets (that is the point: + * the people it is for say what they want); on a private one, its members. + */ +@CommandHandler(VoteIssueCommand) +export class VoteIssueCommandHandler + implements ICommandHandler +{ + constructor(private readonly access: WriteAccess) {} + + async execute(command: VoteIssueCommand): Promise { + const issue = await this.access.issue(command.issueId); + const project = await this.access.project(issue.projectId); + if (!project.isPublic && !project.isMember(command.actorId)) + throw new ForbiddenError( + `You are not a member of project ${project.key}`, + ); + if (issue.trashedAt) + throw new BusinessRuleError(`${issue.key} is in the trash`); + issue.vote(command.actorId, command.on); + await issue.commitAndWait(); + return ack(issue); + } +} diff --git a/libs/api/tracker/application/src/lib/commands/vote-issue.command.ts b/libs/api/tracker/application/src/lib/commands/vote-issue.command.ts new file mode 100644 index 0000000..97b5e13 --- /dev/null +++ b/libs/api/tracker/application/src/lib/commands/vote-issue.command.ts @@ -0,0 +1,13 @@ +import { Command } from '@nestjs/cqrs'; +import { CommandResult } from './command-result'; + +/** The actor votes for a ticket (`on`) or takes the vote back. */ +export class VoteIssueCommand extends Command { + constructor( + public readonly actorId: string, + public readonly issueId: string, + public readonly on: boolean, + ) { + super(); + } +} diff --git a/libs/api/tracker/application/src/lib/comments.service.ts b/libs/api/tracker/application/src/lib/comments.service.ts index f155212..bf6d590 100644 --- a/libs/api/tracker/application/src/lib/comments.service.ts +++ b/libs/api/tracker/application/src/lib/comments.service.ts @@ -5,6 +5,7 @@ import { AddCommentCommand } from './commands/add-comment.command'; import { CommandResult } from './commands/command-result'; import { DeleteCommentCommand } from './commands/delete-comment.command'; import { EditCommentCommand } from './commands/edit-comment.command'; +import { ReactToCommentCommand } from './commands/react-to-comment.command'; import { Page } from './ports/find-issues.repository'; import { GetCommentsQuery } from './queries/get-comments.query'; @@ -36,6 +37,18 @@ export class CommentsService { ); } + /** Adds (`on`) or takes back one's reaction (👍…). */ + react( + actorId: string, + commentId: string, + emoji: string, + on: boolean, + ): Promise { + return this.commandBus.execute( + new ReactToCommentCommand(actorId, commentId, emoji, on), + ); + } + delete(actorId: string, commentId: string): Promise { return this.commandBus.execute( new DeleteCommentCommand(actorId, commentId), diff --git a/libs/api/tracker/application/src/lib/event-handlers/comment-added.event-handler.ts b/libs/api/tracker/application/src/lib/event-handlers/comment-added.event-handler.ts index f3b7681..12edf48 100644 --- a/libs/api/tracker/application/src/lib/event-handlers/comment-added.event-handler.ts +++ b/libs/api/tracker/application/src/lib/event-handlers/comment-added.event-handler.ts @@ -29,6 +29,7 @@ export class CommentAddedEventHandler body: comment.body, replyTo: comment.replyTo ?? null, deleted: false, + reactions: [], createdAt: comment.createdAt, editedAt: null, version: versionOf(event), diff --git a/libs/api/tracker/application/src/lib/event-handlers/comment-reacted.event-handler.ts b/libs/api/tracker/application/src/lib/event-handlers/comment-reacted.event-handler.ts new file mode 100644 index 0000000..32e2ed9 --- /dev/null +++ b/libs/api/tracker/application/src/lib/event-handlers/comment-reacted.event-handler.ts @@ -0,0 +1,34 @@ +import { EventsHandler, IEventHandler } from '@nestjs/cqrs'; +import { + CommentReactedEvent, + REACTIONS, +} from '@task-stream/api/tracker/domain'; +import { UpsertMaterializedCommentRepository } from '../ports/upsert-materialized-comment.repository'; +import { UserDirectory } from '../ports/user-directory'; +import { ReadModelNotifier, versionOf } from './read-model-notifier'; + +@EventsHandler(CommentReactedEvent) +export class CommentReactedEventHandler + implements IEventHandler +{ + constructor( + private readonly upsertMaterializedCommentRepository: UpsertMaterializedCommentRepository, + private readonly users: UserDirectory, + private readonly notifier: ReadModelNotifier, + ) {} + + async handle(event: CommentReactedEvent) { + const refs = await this.users.refs(Object.values(event.reactions).flat()); + await this.upsertMaterializedCommentRepository.upsert({ + id: event.aggregateId, + reactions: REACTIONS.filter( + (emoji) => event.reactions[emoji]?.length, + ).map((emoji) => ({ + emoji, + users: event.reactions[emoji].map((id) => refs.of(id)), + })), + version: versionOf(event), + }); + await this.notifier.comment(event.aggregateId, event.issueId, event); + } +} diff --git a/libs/api/tracker/application/src/lib/event-handlers/event-handlers.ts b/libs/api/tracker/application/src/lib/event-handlers/event-handlers.ts index 82ad89a..ae84746 100644 --- a/libs/api/tracker/application/src/lib/event-handlers/event-handlers.ts +++ b/libs/api/tracker/application/src/lib/event-handlers/event-handlers.ts @@ -2,6 +2,8 @@ import { ActivityEventHandler } from './activity.event-handler'; import { CommentAddedEventHandler } from './comment-added.event-handler'; import { CommentDeletedEventHandler } from './comment-deleted.event-handler'; import { CommentEditedEventHandler } from './comment-edited.event-handler'; +import { CommentReactedEventHandler } from './comment-reacted.event-handler'; +import { IssueVotedEventHandler } from './issue-voted.event-handler'; import { IssueAssignedEventHandler } from './issue-assigned.event-handler'; import { IssueCreatedEventHandler } from './issue-created.event-handler'; import { IssueLinkedEventHandler } from './issue-linked.event-handler'; @@ -46,6 +48,8 @@ export const EVENT_HANDLERS = [ CommentAddedEventHandler, CommentDeletedEventHandler, CommentEditedEventHandler, + CommentReactedEventHandler, + IssueVotedEventHandler, IssueAssignedEventHandler, IssueCreatedEventHandler, IssueLinkedEventHandler, diff --git a/libs/api/tracker/application/src/lib/event-handlers/issue-voted.event-handler.ts b/libs/api/tracker/application/src/lib/event-handlers/issue-voted.event-handler.ts new file mode 100644 index 0000000..49e5d06 --- /dev/null +++ b/libs/api/tracker/application/src/lib/event-handlers/issue-voted.event-handler.ts @@ -0,0 +1,23 @@ +import { EventsHandler, IEventHandler } from '@nestjs/cqrs'; +import { IssueVotedEvent } from '@task-stream/api/tracker/domain'; +import { UpsertMaterializedIssueRepository } from '../ports/upsert-materialized-issue.repository'; +import { ReadModelNotifier, versionOf } from './read-model-notifier'; + +@EventsHandler(IssueVotedEvent) +export class IssueVotedEventHandler implements IEventHandler { + constructor( + private readonly upsertMaterializedIssueRepository: UpsertMaterializedIssueRepository, + private readonly notifier: ReadModelNotifier, + ) {} + + async handle(event: IssueVotedEvent) { + // A vote is not a change to the ticket: `updatedAt` stays. + await this.upsertMaterializedIssueRepository.upsert({ + id: event.aggregateId, + votes: event.voterIds.length, + voterIds: event.voterIds, + version: versionOf(event), + }); + await this.notifier.issue(event.aggregateId, event); + } +} diff --git a/libs/api/tracker/application/src/lib/event-handlers/project-created.event-handler.ts b/libs/api/tracker/application/src/lib/event-handlers/project-created.event-handler.ts index e7dcd4c..0c35f71 100644 --- a/libs/api/tracker/application/src/lib/event-handlers/project-created.event-handler.ts +++ b/libs/api/tracker/application/src/lib/event-handlers/project-created.event-handler.ts @@ -26,6 +26,7 @@ export class ProjectCreatedEventHandler name: project.name, description: project.description, isPublic: project.isPublic ?? false, + acceptsProposals: project.acceptsProposals ?? false, owner: users.of(project.ownerId), members: project.members.map((m) => ({ user: users.of(m.userId), diff --git a/libs/api/tracker/application/src/lib/issues.service.ts b/libs/api/tracker/application/src/lib/issues.service.ts index bc205d3..42d09e6 100644 --- a/libs/api/tracker/application/src/lib/issues.service.ts +++ b/libs/api/tracker/application/src/lib/issues.service.ts @@ -8,8 +8,11 @@ import { IssueReadModel, } from '@task-stream/api/tracker/domain'; import { AssignIssueCommand } from './commands/assign-issue.command'; +import { DuplicateIssueCommand } from './commands/duplicate-issue.command'; +import { VoteIssueCommand } from './commands/vote-issue.command'; import { AttachFileCommand, + AttachmentResult, IncomingFile, } from './commands/attach-file.command'; import { DetachFileCommand } from './commands/detach-file.command'; @@ -169,7 +172,7 @@ export class IssuesService { issueId: string, file: IncomingFile, commentId: string | null = null, - ): Promise { + ): Promise { return this.commandBus.execute( new AttachFileCommand(actorId, issueId, file, commentId), ); @@ -258,6 +261,16 @@ export class IssuesService { return this.commandBus.execute(new RestoreIssueCommand(actorId, issueId)); } + /** Votes for the ticket (`on`) or takes the vote back. */ + vote(actorId: string, issueId: string, on: boolean): Promise { + return this.commandBus.execute(new VoteIssueCommand(actorId, issueId, on)); + } + + /** A new ticket like this one (what it says, not where it stands). */ + duplicate(actorId: string, issueId: string): Promise { + return this.commandBus.execute(new DuplicateIssueCommand(actorId, issueId)); + } + trashed( viewerId: string | null, projectId: string, diff --git a/libs/api/tracker/application/src/lib/projects.service.ts b/libs/api/tracker/application/src/lib/projects.service.ts index 4c61628..6f91655 100644 --- a/libs/api/tracker/application/src/lib/projects.service.ts +++ b/libs/api/tracker/application/src/lib/projects.service.ts @@ -1,3 +1,7 @@ +import { + ProposalKind, + SubmitProposalCommand, +} from './commands/submit-proposal.command'; import { GetShowcaseQuery, Showcase } from './queries/get-showcase.query'; import { Injectable } from '@nestjs/common'; import { CommandBus, QueryBus } from '@nestjs/cqrs'; @@ -34,6 +38,19 @@ export class ProjectsService { ) {} /** A public project's roadmap, releases, sprint and good first tickets (no token). */ + /** A bug report or an idea from anyone, for a public project that takes them. */ + propose( + project: string, + kind: ProposalKind, + title: string, + description: string, + author: string | null, + ): Promise { + return this.commandBus.execute( + new SubmitProposalCommand(project, kind, title, description, author), + ); + } + showcase(project: string): Promise { return this.queryBus.execute(new GetShowcaseQuery(project)); } @@ -61,7 +78,12 @@ export class ProjectsService { update( actorId: string, projectId: string, - changes: { name?: string; description?: string | null; isPublic?: boolean }, + changes: { + name?: string; + description?: string | null; + isPublic?: boolean; + acceptsProposals?: boolean; + }, ): Promise { return this.commandBus.execute( new UpdateProjectCommand(actorId, projectId, changes), diff --git a/libs/api/tracker/application/src/lib/queries/get-showcase.query.ts b/libs/api/tracker/application/src/lib/queries/get-showcase.query.ts index 2f163a7..1b20f4d 100644 --- a/libs/api/tracker/application/src/lib/queries/get-showcase.query.ts +++ b/libs/api/tracker/application/src/lib/queries/get-showcase.query.ts @@ -6,6 +6,8 @@ import { FindProjectsRepository } from '../ports/find-projects.repository'; import { FindReleasesRepository } from '../ports/find-releases.repository'; import { FindSprintsRepository } from '../ports/find-sprints.repository'; +import { PROPOSAL_LABEL } from '../commands/submit-proposal.command-handler'; + /** Tickets with this label are offered to newcomers on public pages. */ export const GOOD_FIRST_LABEL = 'good-first-issue'; @@ -35,6 +37,8 @@ export interface Showcase { dueDate: string | null; percent: number; done: boolean; + /** How many want it. */ + votes: number; path: string; }[]; releases: { @@ -46,6 +50,20 @@ export interface Showcase { notes: string | null; }[]; goodFirst: { key: string; title: string; type: string; path: string }[]; + /** Bug reports and ideas from the public: whether it takes them, where, and the open ones. */ + proposals: { + open: boolean; + /** The form in the web app, while it takes them. */ + path: string | null; + /** Open proposals, most voted first. */ + top: { + key: string; + title: string; + type: string; + votes: number; + path: string; + }[]; + }; } export class GetShowcaseQuery extends Query { @@ -55,6 +73,11 @@ export class GetShowcaseQuery extends Query { } const FINISHED = [StatusCategory.DONE, StatusCategory.CANCELLED]; +const OPEN = [ + StatusCategory.TODO, + StatusCategory.IN_PROGRESS, + StatusCategory.QA, +]; @QueryHandler(GetShowcaseQuery) export class GetShowcaseQueryHandler @@ -74,7 +97,7 @@ export class GetShowcaseQueryHandler (await this.findProjects.findByKey(query.project.toUpperCase())); if (!project?.isPublic) throw new NotFoundError('Project', query.project); const path = (key: string) => `/p/${project.key}/issues/${key}`; - const [epics, releases, sprint, goodFirst] = await Promise.all([ + const [epics, releases, sprint, goodFirst, proposals] = await Promise.all([ this.findIssues.epics(project.id), this.findReleases.findByProject(project.id), this.findSprints.findActive(project.id), @@ -85,6 +108,13 @@ export class GetShowcaseQueryHandler limit: 20, offset: 0, }), + this.findIssues.search({ + projectId: project.id, + labels: [PROPOSAL_LABEL], + categories: OPEN, + limit: 100, + offset: 0, + }), ]); const visible = releases .filter((r) => r.status !== ReleaseStatus.ARCHIVED) @@ -120,6 +150,7 @@ export class GetShowcaseQueryHandler dueDate: issue.dueDate, percent: p.percent, done: FINISHED.includes(issue.statusCategory), + votes: issue.votes, path: path(issue.key), })), releases: visible.map((r, i) => ({ @@ -136,6 +167,20 @@ export class GetShowcaseQueryHandler type: i.type, path: path(i.key), })), + proposals: { + open: project.acceptsProposals, + path: project.acceptsProposals ? `/p/${project.key}/proponer` : null, + top: [...proposals.items] + .sort((a, b) => b.votes - a.votes) + .slice(0, 10) + .map((i) => ({ + key: i.key, + title: i.title, + type: i.type, + votes: i.votes, + path: path(i.key), + })), + }, }; } } diff --git a/libs/api/tracker/application/src/lib/sagas/sagas.spec.ts b/libs/api/tracker/application/src/lib/sagas/sagas.spec.ts index 157123d..73d1102 100644 --- a/libs/api/tracker/application/src/lib/sagas/sagas.spec.ts +++ b/libs/api/tracker/application/src/lib/sagas/sagas.spec.ts @@ -55,6 +55,7 @@ import { StartSprintCommand, } from '../commands/sprint.commands'; import { FindSprintsRepository } from '../ports/find-sprints.repository'; +import { FindProjectsRepository } from '../ports/find-projects.repository'; import { SprintCarryOverSaga } from './sprint-carry-over.saga'; import { FindIssuesRepository } from '../ports/find-issues.repository'; import { IssueNumbersRepository } from '../ports/issue-numbers.repository'; @@ -87,6 +88,8 @@ async function setup() { IssueTree, AggregateRehydrator, { provide: EventStore, useValue: store }, + // Proposals look projects up in the read model; no saga sends one. + { provide: FindProjectsRepository, useValue: {} }, { provide: AttachmentStorage, useValue: files }, { provide: UserDirectory, useValue: users }, { provide: ProjectKeysRepository, useClass: InMemoryProjectKeys }, diff --git a/libs/api/tracker/application/src/lib/tracker-application.module.ts b/libs/api/tracker/application/src/lib/tracker-application.module.ts index 8122d98..2df214e 100644 --- a/libs/api/tracker/application/src/lib/tracker-application.module.ts +++ b/libs/api/tracker/application/src/lib/tracker-application.module.ts @@ -17,6 +17,7 @@ import { ReadAccess } from './queries/read-access'; import { ReleasesService } from './releases.service'; import { SAGAS } from './sagas/sagas'; import { WorkflowsService } from './workflows.service'; +import { BlockersService } from './blockers.service'; import { NotificationsService } from './notifications.service'; import { Notifier } from './notifications/notifier'; import { NotificationsEventHandler } from './notifications/notifications.event-handler'; @@ -60,6 +61,7 @@ const SERVICES = [ ReleasesService, ChangesService, WorkflowsService, + BlockersService, NotificationsService, SavedFiltersService, SprintsService, diff --git a/libs/api/tracker/domain/src/lib/comment/comment.ts b/libs/api/tracker/domain/src/lib/comment/comment.ts index eace8cf..928ff08 100644 --- a/libs/api/tracker/domain/src/lib/comment/comment.ts +++ b/libs/api/tracker/domain/src/lib/comment/comment.ts @@ -7,6 +7,10 @@ import { import { CommentAddedEvent } from '../events/comment-added.event'; import { CommentDeletedEvent } from '../events/comment-deleted.event'; import { CommentEditedEvent } from '../events/comment-edited.event'; +import { CommentReactedEvent } from '../events/comment-reacted.event'; + +/** The reactions a comment takes, in the order they are shown (GitHub's). */ +export const REACTIONS = ['👍', '👎', '😄', '🎉', '😕', '❤️', '🚀', '👀']; /** Data of a comment (what CommentAddedEvent carries). */ export interface CommentProps { @@ -35,6 +39,8 @@ export class Comment extends VersionedAggregateRoot implements CommentProps { public authorId!: string; public body!: string; public replyTo: string | null = null; + /** Who chose each emoji (only the ones somebody chose). */ + public reactions: Record = {}; public deleted = false; public createdAt!: string; public editedAt: string | null = null; @@ -62,6 +68,31 @@ export class Comment extends VersionedAggregateRoot implements CommentProps { ); } + /** Adds (`on`) or takes back the actor's reaction; repeating it changes nothing. */ + react(actorId: string, emoji: string, on: boolean): void { + this.assertAlive(); + assertThat( + REACTIONS.includes(emoji), + `Reactions are one of ${REACTIONS.join(' ')}`, + ); + const users = this.reactions[emoji] ?? []; + if (on === users.includes(actorId)) return; + const next = { + ...this.reactions, + [emoji]: on ? [...users, actorId] : users.filter((u) => u !== actorId), + }; + if (!next[emoji].length) delete next[emoji]; + this.apply( + new CommentReactedEvent( + actorId, + this.id, + this.projectId, + this.issueId, + next, + ), + ); + } + /** @param canModerate whether the actor manages the project (may delete others' comments). */ delete(actorId: string, canModerate: boolean): void { this.assertAlive(); @@ -86,6 +117,10 @@ export class Comment extends VersionedAggregateRoot implements CommentProps { this.editedAt = event.occurredAt; } + onCommentReactedEvent(event: CommentReactedEvent): void { + this.reactions = event.reactions; + } + onCommentDeletedEvent(): void { this.deleted = true; } diff --git a/libs/api/tracker/domain/src/lib/events/comment-reacted.event.ts b/libs/api/tracker/domain/src/lib/events/comment-reacted.event.ts new file mode 100644 index 0000000..f4205f0 --- /dev/null +++ b/libs/api/tracker/domain/src/lib/events/comment-reacted.event.ts @@ -0,0 +1,17 @@ +import { AutowiredEvent } from '@task-stream/api/shared/domain'; +import { TrackerEvent } from './tracker.event'; + +/** Someone added or took back a reaction (👍…) on a comment. */ +@AutowiredEvent +export class CommentReactedEvent extends TrackerEvent { + constructor( + actorId: string, + commentId: string, + projectId: string, + readonly issueId: string, + /** Every reaction after the change: who chose each emoji. */ + readonly reactions: Record, + ) { + super(actorId, commentId, projectId); + } +} diff --git a/libs/api/tracker/domain/src/lib/events/index.ts b/libs/api/tracker/domain/src/lib/events/index.ts index 924528c..c8b8789 100644 --- a/libs/api/tracker/domain/src/lib/events/index.ts +++ b/libs/api/tracker/domain/src/lib/events/index.ts @@ -14,6 +14,7 @@ export * from './issue-unlinked.event'; export * from './issue-release-changed.event'; export * from './comment-added.event'; export * from './comment-edited.event'; +export * from './comment-reacted.event'; export * from './comment-deleted.event'; export * from './release-created.event'; export * from './release-updated.event'; @@ -25,6 +26,7 @@ export * from './release-deleted.event'; export * from './issue-attachment-added.event'; export * from './issue-attachment-removed.event'; export * from './issue-watched.event'; +export * from './issue-voted.event'; export * from './issue-unwatched.event'; export * from './issue-parent-changed.event'; export * from './issue-checklist-item-added.event'; diff --git a/libs/api/tracker/domain/src/lib/events/issue-voted.event.ts b/libs/api/tracker/domain/src/lib/events/issue-voted.event.ts new file mode 100644 index 0000000..b4498a1 --- /dev/null +++ b/libs/api/tracker/domain/src/lib/events/issue-voted.event.ts @@ -0,0 +1,16 @@ +import { AutowiredEvent } from '@task-stream/api/shared/domain'; +import { TrackerEvent } from './tracker.event'; + +/** Someone voted for a ticket, or took the vote back. */ +@AutowiredEvent +export class IssueVotedEvent extends TrackerEvent { + constructor( + actorId: string, + issueId: string, + projectId: string, + /** Everyone who wants it, after the change. */ + readonly voterIds: string[], + ) { + super(actorId, issueId, projectId); + } +} diff --git a/libs/api/tracker/domain/src/lib/events/project-updated.event.ts b/libs/api/tracker/domain/src/lib/events/project-updated.event.ts index 9b9329f..f22346e 100644 --- a/libs/api/tracker/domain/src/lib/events/project-updated.event.ts +++ b/libs/api/tracker/domain/src/lib/events/project-updated.event.ts @@ -2,14 +2,17 @@ import { AutowiredEvent } from '@task-stream/api/shared/domain'; import type { ProjectProps } from '../project/project'; import { TrackerEvent } from './tracker.event'; -/** Name, description or visibility changed. */ +/** Name, description, visibility or whether it takes public proposals changed. */ @AutowiredEvent export class ProjectUpdatedEvent extends TrackerEvent { constructor( actorId: string, projectId: string, readonly changes: Partial< - Pick + Pick< + ProjectProps, + 'name' | 'description' | 'isPublic' | 'acceptsProposals' + > >, ) { super(actorId, projectId, projectId); diff --git a/libs/api/tracker/domain/src/lib/issue/issue.ts b/libs/api/tracker/domain/src/lib/issue/issue.ts index 41f4775..4c9c03e 100644 --- a/libs/api/tracker/domain/src/lib/issue/issue.ts +++ b/libs/api/tracker/domain/src/lib/issue/issue.ts @@ -25,6 +25,7 @@ import { IssueUnlinkedEvent } from '../events/issue-unlinked.event'; import { IssueUpdatedEvent } from '../events/issue-updated.event'; import { IssueUnwatchedEvent } from '../events/issue-unwatched.event'; import { IssueWatchedEvent } from '../events/issue-watched.event'; +import { IssueVotedEvent } from '../events/issue-voted.event'; import { ProjectWorkflow } from '../project/project-settings'; import { IssueAttachment, @@ -116,6 +117,8 @@ export class Issue extends VersionedAggregateRoot implements IssueProps { public attachments: IssueAttachment[] = []; /** People who asked to be told about this ticket. */ public watchers: string[] = []; + /** People who want it done (a public roadmap's way to prioritise). */ + public voterIds: string[] = []; /** The epic or ticket this one breaks down. */ public parentId: string | null = null; public checklist: ChecklistItem[] = []; @@ -337,6 +340,21 @@ export class Issue extends VersionedAggregateRoot implements IssueProps { ); } + /** The actor votes for it (`on`) or takes the vote back. Idempotent. */ + vote(actorId: string, on: boolean): void { + if (on === this.voterIds.includes(actorId)) return; + this.apply( + new IssueVotedEvent( + actorId, + this.id, + this.projectId, + on + ? [...this.voterIds, actorId] + : this.voterIds.filter((id) => id !== actorId), + ), + ); + } + /** `userId` starts following the ticket. Idempotent. */ watch(actorId: string, userId: string): void { if (this.watchers.includes(userId)) return; @@ -553,6 +571,10 @@ export class Issue extends VersionedAggregateRoot implements IssueProps { this.updatedAt = event.occurredAt; } + onIssueVotedEvent(event: IssueVotedEvent): void { + this.voterIds = event.voterIds; + } + onIssueWatchedEvent(event: IssueWatchedEvent): void { this.watchers = [...this.watchers, event.userId]; } diff --git a/libs/api/tracker/domain/src/lib/project/project.ts b/libs/api/tracker/domain/src/lib/project/project.ts index 78f74d7..ddb4977 100644 --- a/libs/api/tracker/domain/src/lib/project/project.ts +++ b/libs/api/tracker/domain/src/lib/project/project.ts @@ -32,6 +32,11 @@ export interface ProjectProps { description: string | null; /** Anyone (even without signing in) can read it. Absent in old projects: private. */ isPublic?: boolean; + /** + * Takes bug reports and ideas from anyone, through a public form (only + * while it is public). Absent in old projects: no. + */ + acceptsProposals?: boolean; ownerId: string; members: ProjectMember[]; /** Absent in projects created before settings existed: defaults apply. */ @@ -49,6 +54,7 @@ export class Project extends VersionedAggregateRoot implements ProjectProps { public name!: string; public description: string | null = null; public isPublic = false; + public acceptsProposals = false; public ownerId!: string; public members: ProjectMember[] = []; public settings: ProjectSettings = defaultProjectSettings(); @@ -104,13 +110,19 @@ export class Project extends VersionedAggregateRoot implements ProjectProps { updateDetails( actorId: string, - changes: { name?: string; description?: string | null; isPublic?: boolean }, + changes: { + name?: string; + description?: string | null; + isPublic?: boolean; + acceptsProposals?: boolean; + }, ): void { this.assertCanManage(actorId); const patch: { name?: string; description?: string | null; isPublic?: boolean; + acceptsProposals?: boolean; } = {}; if (changes.name !== undefined) { const name = changes.name.trim(); @@ -123,6 +135,11 @@ export class Project extends VersionedAggregateRoot implements ProjectProps { } if (changes.isPublic !== undefined && changes.isPublic !== this.isPublic) patch.isPublic = changes.isPublic; + if ( + changes.acceptsProposals !== undefined && + changes.acceptsProposals !== this.acceptsProposals + ) + patch.acceptsProposals = changes.acceptsProposals; if (Object.keys(patch).length === 0) return; this.apply(new ProjectUpdatedEvent(actorId, this.id, patch)); } @@ -213,6 +230,7 @@ export class Project extends VersionedAggregateRoot implements ProjectProps { this.name = project.name; this.description = project.description; this.isPublic = project.isPublic ?? false; + this.acceptsProposals = project.acceptsProposals ?? false; this.ownerId = project.ownerId; this.members = project.members.map((m) => ({ ...m })); this.settings = structuredClone( diff --git a/libs/api/tracker/domain/src/lib/read-models/comment.read-model.ts b/libs/api/tracker/domain/src/lib/read-models/comment.read-model.ts index af1de83..1670ff6 100644 --- a/libs/api/tracker/domain/src/lib/read-models/comment.read-model.ts +++ b/libs/api/tracker/domain/src/lib/read-models/comment.read-model.ts @@ -1,5 +1,11 @@ import { UserRefReadModel } from './user-ref.read-model'; +/** One emoji on a comment and who chose it. */ +export class CommentReactionReadModel { + emoji!: string; + users!: UserRefReadModel[]; +} + export class CommentReadModel { id!: string; issueId!: string; @@ -13,6 +19,8 @@ export class CommentReadModel { * conversation under it still makes sense. Gone with its last reply. */ deleted!: boolean; + /** In the order they are offered; only the ones somebody chose. */ + reactions!: CommentReactionReadModel[]; createdAt!: string; editedAt!: string | null; version!: number; diff --git a/libs/api/tracker/domain/src/lib/read-models/issue.read-model.ts b/libs/api/tracker/domain/src/lib/read-models/issue.read-model.ts index 6425de6..e3ee7ae 100644 --- a/libs/api/tracker/domain/src/lib/read-models/issue.read-model.ts +++ b/libs/api/tracker/domain/src/lib/read-models/issue.read-model.ts @@ -81,6 +81,10 @@ export class IssueReadModel { attachments!: AttachmentReadModel[]; /** People following the ticket. */ watchers!: UserRefReadModel[]; + /** How many want it done. */ + votes!: number; + /** Who voted: to tell someone whether they did; never shown as a list. */ + voterIds!: string[]; parent!: IssueParentReadModel | null; /** Place in the backlog (and in each board column): ascending. */ rank!: string; diff --git a/libs/api/tracker/domain/src/lib/read-models/project.read-model.ts b/libs/api/tracker/domain/src/lib/read-models/project.read-model.ts index ad011fd..dd77a55 100644 --- a/libs/api/tracker/domain/src/lib/read-models/project.read-model.ts +++ b/libs/api/tracker/domain/src/lib/read-models/project.read-model.ts @@ -14,6 +14,8 @@ export class ProjectReadModel { description!: string | null; /** Readable by anyone, also without signing in. */ isPublic!: boolean; + /** Takes bug reports and ideas from anyone (only while public). */ + acceptsProposals!: boolean; owner!: UserRefReadModel; members!: ProjectMemberReadModel[]; /** Statuses, transitions, ticket types and areas. */ diff --git a/libs/api/tracker/infrastructure/src/lib/mongo/find.repositories.ts b/libs/api/tracker/infrastructure/src/lib/mongo/find.repositories.ts index 57510ac..49fad10 100644 --- a/libs/api/tracker/infrastructure/src/lib/mongo/find.repositories.ts +++ b/libs/api/tracker/infrastructure/src/lib/mongo/find.repositories.ts @@ -50,6 +50,7 @@ const commentFromDoc = (doc: CommentDoc): CommentReadModel => ({ ...fromDoc(doc), replyTo: doc.replyTo ?? null, deleted: doc.deleted ?? false, + reactions: doc.reactions ?? [], }); const escapeRegex = (text: string) => @@ -63,6 +64,7 @@ function toProject(doc: ProjectDoc): ProjectReadModel { return { ...fromDoc(rest), isPublic: rest.isPublic ?? false, + acceptsProposals: rest.acceptsProposals ?? false, settings: rest.settings ?? defaultProjectSettings(), }; } diff --git a/libs/api/tracker/infrastructure/src/lib/mongo/read-model.schemas.ts b/libs/api/tracker/infrastructure/src/lib/mongo/read-model.schemas.ts index c13cce8..9e1d34e 100644 --- a/libs/api/tracker/infrastructure/src/lib/mongo/read-model.schemas.ts +++ b/libs/api/tracker/infrastructure/src/lib/mongo/read-model.schemas.ts @@ -293,6 +293,8 @@ export function issueFromDoc(doc: IssueDoc): IssueReadModel { // Tickets projected before attachments existed have none. attachments: rest.attachments ?? [], watchers: rest.watchers ?? [], + votes: rest.votes ?? 0, + voterIds: rest.voterIds ?? [], parent: rest.parent?.id ? rest.parent : null, rank: rest.rank ?? implicitRank(rest.number), startDate: rest.startDate ?? null, diff --git a/libs/api/tracker/presenters/src/lib/graphql/comment.resolver.ts b/libs/api/tracker/presenters/src/lib/graphql/comment.resolver.ts index 4d8309e..fa1c5c3 100644 --- a/libs/api/tracker/presenters/src/lib/graphql/comment.resolver.ts +++ b/libs/api/tracker/presenters/src/lib/graphql/comment.resolver.ts @@ -31,6 +31,18 @@ export class CommentResolver { return this.comments.edit(me.id, commentId, body); } + @Mutation(() => CommandResultGql, { + description: 'React (👍 👎 😄 🎉 😕 ❤️ 🚀 👀) or take it back (on: false)', + }) + reactToComment( + @CurrentUser() me: User, + @Args('commentId', { type: () => ID }) commentId: string, + @Args('emoji') emoji: string, + @Args('on') on: boolean, + ) { + return this.comments.react(me.id, commentId, emoji, on); + } + @Mutation(() => CommandResultGql, { description: 'Author or project admin' }) deleteComment( @CurrentUser() me: User, diff --git a/libs/api/tracker/presenters/src/lib/graphql/inputs.ts b/libs/api/tracker/presenters/src/lib/graphql/inputs.ts index 33d8161..2e0f42e 100644 --- a/libs/api/tracker/presenters/src/lib/graphql/inputs.ts +++ b/libs/api/tracker/presenters/src/lib/graphql/inputs.ts @@ -74,6 +74,14 @@ export class UpdateProjectInput { @IsOptional() @IsBoolean() isPublic?: boolean; + @Field({ + nullable: true, + description: + 'Take bug reports and ideas from anyone through the public form (while public)', + }) + @IsOptional() + @IsBoolean() + acceptsProposals?: boolean; } @InputType() diff --git a/libs/api/tracker/presenters/src/lib/graphql/issue.resolver.ts b/libs/api/tracker/presenters/src/lib/graphql/issue.resolver.ts index d576987..7672b4d 100644 --- a/libs/api/tracker/presenters/src/lib/graphql/issue.resolver.ts +++ b/libs/api/tracker/presenters/src/lib/graphql/issue.resolver.ts @@ -14,6 +14,7 @@ import { OptionalAuth, } from '@task-stream/api/identity/presenters'; import { + BlockersService, CommentsService, IssuesService, WorkflowsService, @@ -44,6 +45,7 @@ import { EpicGql, IssueGql, IssuePageGql, + IssueParentGql, } from './types'; @Resolver(() => IssueGql) @@ -52,6 +54,7 @@ export class IssueResolver { private readonly issuesService: IssuesService, private readonly commentsService: CommentsService, private readonly workflows: WorkflowsService, + private readonly blockers: BlockersService, ) {} @OptionalAuth() @@ -154,6 +157,22 @@ export class IssueResolver { return this.workflows.allowedTransitions(issue); } + @ResolveField(() => [IssueParentGql], { + description: + 'Open tickets it waits for: the ones that block it and the ones it depends on', + }) + blockedBy(@Parent() issue: IssueReadModel) { + return this.blockers.blockedBy(issue); + } + + @ResolveField(() => Boolean, { description: 'Whether I voted for it' }) + voted( + @CurrentUser() me: User | undefined, + @Parent() issue: IssueReadModel, + ): boolean { + return !!me && issue.voterIds.includes(me.id); + } + @ResolveField(() => [IssueGql], { description: 'Linked tickets I can see' }) linkedIssues( @CurrentUser() me: User | undefined, @@ -307,6 +326,29 @@ export class IssueResolver { return this.issuesService.trash(me.id, issueId); } + @Mutation(() => CommandResultGql, { + description: + 'A new ticket like this one: what it says, not where it stands (the key comes in the result)', + }) + duplicateIssue( + @CurrentUser() me: User, + @Args('issueId', { type: () => ID }) issueId: string, + ) { + return this.issuesService.duplicate(me.id, issueId); + } + + @Mutation(() => CommandResultGql, { + description: + 'Vote for a ticket (on) or take the vote back: anyone signed in on a public project, members on a private one', + }) + voteIssue( + @CurrentUser() me: User, + @Args('issueId', { type: () => ID }) issueId: string, + @Args('on') on: boolean, + ) { + return this.issuesService.vote(me.id, issueId, on); + } + @Mutation(() => CommandResultGql, { description: 'Back from the trash' }) restoreIssue( @CurrentUser() me: User, diff --git a/libs/api/tracker/presenters/src/lib/graphql/types.ts b/libs/api/tracker/presenters/src/lib/graphql/types.ts index 21e538d..6c88fa4 100644 --- a/libs/api/tracker/presenters/src/lib/graphql/types.ts +++ b/libs/api/tracker/presenters/src/lib/graphql/types.ts @@ -102,6 +102,10 @@ export class ProjectGql { @Field(() => String, { nullable: true }) description!: string | null; @Field({ description: 'Anyone can read it, also without signing in' }) isPublic!: boolean; + @Field({ + description: 'Takes bug reports and ideas from anyone (while public)', + }) + acceptsProposals!: boolean; @Field(() => UserRefGql) owner!: UserRefGql; @Field(() => [ProjectMemberGql]) members!: ProjectMemberGql[]; @Field() createdAt!: string; @@ -374,6 +378,8 @@ export class IssueGql { }) devLinks!: DevLinkGql[]; @Field(() => Int) commentCount!: number; + @Field(() => Int, { description: 'How many want it done' }) + votes!: number; @Field() createdAt!: string; @Field() updatedAt!: string; @Field(() => Int) version!: number; @@ -440,6 +446,13 @@ export class BoardColumnGql { @Field(() => Int) total!: number; } +@ObjectType('CommentReaction', { description: 'One emoji on a comment' }) +export class CommentReactionGql { + @Field() emoji!: string; + @Field(() => [UserRefGql], { description: 'Who chose it' }) + users!: UserRefGql[]; +} + @ObjectType('Comment') export class CommentGql { @Field(() => ID) id!: string; @@ -456,6 +469,10 @@ export class CommentGql { description: 'Deleted, but kept (without its text) while it has replies', }) deleted!: boolean; + @Field(() => [CommentReactionGql], { + description: 'In the order they are offered; only the ones somebody chose', + }) + reactions!: CommentReactionGql[]; @Field() createdAt!: string; @Field(() => String, { nullable: true }) editedAt!: string | null; @Field(() => Int) version!: number; diff --git a/libs/api/tracker/presenters/src/lib/http/attachments.controller.ts b/libs/api/tracker/presenters/src/lib/http/attachments.controller.ts index 6feb9cf..d2055b3 100644 --- a/libs/api/tracker/presenters/src/lib/http/attachments.controller.ts +++ b/libs/api/tracker/presenters/src/lib/http/attachments.controller.ts @@ -36,7 +36,7 @@ import { IssuesService } from '@task-stream/api/tracker/application'; import type { Response } from 'express'; import { viewerOf } from '../common/viewer'; import { AttachFileDto } from './dto/requests.dto'; -import { CommandResultDto } from './dto/responses.dto'; +import { AttachmentResultDto, CommandResultDto } from './dto/responses.dto'; import { Refs } from './refs'; const ISSUE = ApiParam({ @@ -80,7 +80,7 @@ export class AttachmentsController { 'Multipart with the file as `file` and, optionally, `commentId` to place it under a comment. ' + 'Up to ATTACHMENTS_MAX_MB megabytes (25 by default) and 50 files per ticket.', }) - @ApiCreatedResponse({ type: CommandResultDto }) + @ApiCreatedResponse({ type: AttachmentResultDto }) @ApiCommandErrors() async attach( @CurrentUser() me: User, diff --git a/libs/api/tracker/presenters/src/lib/http/comments.controller.ts b/libs/api/tracker/presenters/src/lib/http/comments.controller.ts index a9565d1..e8f5ee7 100644 --- a/libs/api/tracker/presenters/src/lib/http/comments.controller.ts +++ b/libs/api/tracker/presenters/src/lib/http/comments.controller.ts @@ -1,4 +1,12 @@ -import { Body, Controller, Delete, Param, Patch } from '@nestjs/common'; +import { + Body, + Controller, + Delete, + HttpCode, + Param, + Patch, + Post, +} from '@nestjs/common'; import { ApiOkResponse, ApiOperation, ApiTags } from '@nestjs/swagger'; import { User } from '@task-stream/api/identity/domain'; import { @@ -7,7 +15,8 @@ import { } from '@task-stream/api/identity/presenters'; import { ApiCommandErrors } from '@task-stream/api/shared/presenters'; import { CommentsService } from '@task-stream/api/tracker/application'; -import { CommentBodyDto } from './dto/requests.dto'; +import { REACTIONS } from '@task-stream/api/tracker/domain'; +import { CommentBodyDto, ReactToCommentDto } from './dto/requests.dto'; import { CommandResultDto } from './dto/responses.dto'; /** REST adapter of the comment use cases (listing and adding live under /issues). */ @@ -29,6 +38,22 @@ export class CommentsController { return this.comments.edit(me.id, commentId, body.body); } + @Post(':commentId/reactions') + @HttpCode(200) + @ApiOperation({ + summary: 'React to a comment, or take the reaction back (members)', + description: `One of ${REACTIONS.join(' ')}; repeating it changes nothing.`, + }) + @ApiOkResponse({ type: CommandResultDto }) + @ApiCommandErrors() + react( + @CurrentUser() me: User, + @Param('commentId') commentId: string, + @Body() body: ReactToCommentDto, + ) { + return this.comments.react(me.id, commentId, body.emoji, body.on); + } + @Delete(':commentId') @ApiOperation({ summary: 'Delete a comment (author or project admin)' }) @ApiOkResponse({ type: CommandResultDto }) diff --git a/libs/api/tracker/presenters/src/lib/http/dto/requests.dto.ts b/libs/api/tracker/presenters/src/lib/http/dto/requests.dto.ts index d388a74..b58300b 100644 --- a/libs/api/tracker/presenters/src/lib/http/dto/requests.dto.ts +++ b/libs/api/tracker/presenters/src/lib/http/dto/requests.dto.ts @@ -8,6 +8,7 @@ import { IssueLinkType, IssuePriority, ProjectRole, + REACTIONS, SETTING_COLORS, StatusCategory, TYPE_ICONS, @@ -88,7 +89,15 @@ export class CreateProjectDto { export class UpdateProjectDto extends PartialType( OmitType(CreateProjectDto, ['key'] as const), -) {} +) { + @ApiPropertyOptional({ + description: + 'Take bug reports and ideas from anyone through the public form (while public)', + }) + @IsOptional() + @IsBoolean() + acceptsProposals?: boolean; +} export class DeleteProjectQueryDto { @ApiProperty({ @@ -985,6 +994,59 @@ export class AddCommentDto extends CommentBodyDto { replyTo?: string; } +export class ReactToCommentDto { + @ApiProperty({ enum: REACTIONS, example: '👍' }) + @IsIn(REACTIONS) + emoji!: string; + + @ApiProperty({ description: 'true adds the reaction, false takes it back' }) + @IsBoolean() + on!: boolean; +} + +// ---- Public proposals ------------------------------------------------------- + +export class ProposalDto { + @ApiProperty({ + enum: ['BUG', 'IDEA'], + description: 'A bug report or an idea', + }) + @IsIn(['BUG', 'IDEA']) + kind!: 'BUG' | 'IDEA'; + + @ApiProperty({ minLength: 3, maxLength: 150 }) + @IsString() + @MinLength(3) + @MaxLength(150) + title!: string; + + @ApiPropertyOptional({ + maxLength: 5000, + description: 'What happens, or what they would like (Markdown)', + }) + @IsOptional() + @IsString() + @MaxLength(5000) + description?: string; + + @ApiPropertyOptional({ + maxLength: 80, + description: + 'How they sign it; shown in the ticket (no e-mail: it would be public)', + }) + @IsOptional() + @IsString() + @MaxLength(80) + author?: string; + + @ApiPropertyOptional({ + description: 'Leave empty: a field only bots fill in', + }) + @IsOptional() + @IsString() + website?: string; +} + // ---- Releases --------------------------------------------------------------- export class CreateReleaseDto { diff --git a/libs/api/tracker/presenters/src/lib/http/dto/responses.dto.ts b/libs/api/tracker/presenters/src/lib/http/dto/responses.dto.ts index 687795e..bb84c9a 100644 --- a/libs/api/tracker/presenters/src/lib/http/dto/responses.dto.ts +++ b/libs/api/tracker/presenters/src/lib/http/dto/responses.dto.ts @@ -96,6 +96,11 @@ export class ProjectDto { @ApiProperty({ type: String, nullable: true }) description!: string | null; @ApiProperty({ description: 'Readable by anyone, also without a token' }) isPublic!: boolean; + @ApiProperty({ + description: + 'Takes bug reports and ideas from anyone (POST /api/explore/projects/{project}/proposals) while public', + }) + acceptsProposals!: boolean; @ApiProperty({ type: UserRefDto }) owner!: UserRefDto; @ApiProperty({ type: [ProjectMemberDto] }) members!: ProjectMemberDto[]; @ApiProperty({ type: ProjectSettingsDto }) @@ -279,6 +284,7 @@ class ShowcaseEpicDto { dueDate!: string | null; @ApiProperty() percent!: number; @ApiProperty() done!: boolean; + @ApiProperty({ description: 'How many want it' }) votes!: number; @ApiProperty({ example: '/p/WEB/issues/WEB-3', description: 'In the web app', @@ -308,6 +314,27 @@ class ShowcaseIssueDto { @ApiProperty({ example: '/p/WEB/issues/WEB-9' }) path!: string; } +class ShowcaseProposalDto extends ShowcaseIssueDto { + @ApiProperty({ description: 'How many want it' }) votes!: number; +} + +class ShowcaseProposalsDto { + @ApiProperty({ description: 'Whether it takes bug reports and ideas now' }) + open!: boolean; + @ApiProperty({ + type: String, + nullable: true, + example: '/p/WEB/proponer', + description: 'The form in the web app, while it takes them', + }) + path!: string | null; + @ApiProperty({ + type: [ShowcaseProposalDto], + description: 'Open proposals, most voted first', + }) + top!: ShowcaseProposalDto[]; +} + export class ShowcaseDto { @ApiProperty({ type: ShowcaseProjectDto }) project!: ShowcaseProjectDto; @ApiProperty({ type: ShowcaseSprintDto, nullable: true }) @@ -319,6 +346,25 @@ export class ShowcaseDto { description: 'Open tickets labelled good-first-issue', }) goodFirst!: ShowcaseIssueDto[]; + @ApiProperty({ type: ShowcaseProposalsDto }) + proposals!: ShowcaseProposalsDto; +} + +export class ProposalResultDto { + @ApiProperty({ + type: String, + nullable: true, + example: 'WEB-42', + description: 'The ticket it became', + }) + key!: string | null; + @ApiProperty({ + type: String, + nullable: true, + example: '/p/WEB/issues/WEB-42', + description: 'Where to see it in the web app', + }) + path!: string | null; } export class GitDeliveryResultDto { @@ -390,6 +436,13 @@ export class IssueDto { description: 'The epic or ticket this one breaks down', }) parent!: IssueParentDto | null; + @ApiProperty({ + type: [IssueParentDto], + description: + 'Open tickets it waits for: the ones that block it and the ones it depends on', + }) + blockedBy!: IssueParentDto[]; + @ApiProperty({ description: 'How many want it done' }) votes!: number; @ApiProperty({ description: 'Place in the backlog and its board column (ascending, as text)', @@ -462,6 +515,11 @@ export class BoardColumnDto { total!: number; } +export class CommentReactionDto { + @ApiProperty({ example: '👍' }) emoji!: string; + @ApiProperty({ type: [UserRefDto] }) users!: UserRefDto[]; +} + export class CommentDto { @ApiProperty({ format: 'uuid' }) id!: string; @ApiProperty({ format: 'uuid' }) issueId!: string; @@ -481,6 +539,11 @@ export class CommentDto { description: 'Deleted, but kept (without its text) while it has replies', }) deleted!: boolean; + @ApiProperty({ + type: [CommentReactionDto], + description: 'In the order they are offered; only the ones somebody chose', + }) + reactions!: CommentReactionDto[]; @ApiProperty({ format: 'date-time' }) createdAt!: string; @ApiProperty({ type: String, nullable: true, format: 'date-time' }) editedAt!: string | null; @@ -649,6 +712,15 @@ export class CommandResultDto { version!: number; } +export class AttachmentResultDto extends CommandResultDto { + @ApiProperty({ + format: 'uuid', + description: + 'The new file; `![name](attachment:)` shows an image inside a description or comment', + }) + attachmentId!: string; +} + // ---- Statistics --------------------------------------------------------------- export class CreatedResolvedDto { diff --git a/libs/api/tracker/presenters/src/lib/http/explore.controller.ts b/libs/api/tracker/presenters/src/lib/http/explore.controller.ts index cb3cbf1..6841f7b 100644 --- a/libs/api/tracker/presenters/src/lib/http/explore.controller.ts +++ b/libs/api/tracker/presenters/src/lib/http/explore.controller.ts @@ -1,6 +1,17 @@ -import { Controller, Get, Header, Param } from '@nestjs/common'; import { + Body, + Controller, + Get, + Header, + Param, + Post, + Req, +} from '@nestjs/common'; +import { + ApiCreatedResponse, + ApiForbiddenResponse, ApiNotFoundResponse, + ApiTooManyRequestsResponse, ApiOkResponse, ApiOperation, ApiParam, @@ -8,14 +19,24 @@ import { } from '@nestjs/swagger'; import { Public } from '@task-stream/api/identity/presenters'; import { ProjectsService } from '@task-stream/api/tracker/application'; -import { ProjectDto, ShowcaseDto } from './dto/responses.dto'; +import { Request } from 'express'; +import { ProposalDto } from './dto/requests.dto'; +import { + ProjectDto, + ProposalResultDto, + ShowcaseDto, +} from './dto/responses.dto'; +import { ProposalLimiter } from './proposal-limiter'; import { toProjectDto } from './refs'; /** What anyone can read without signing in. */ @ApiTags('Explore') @Controller('explore') export class ExploreController { - constructor(private readonly projects: ProjectsService) {} + constructor( + private readonly projects: ProjectsService, + private readonly limiter: ProposalLimiter, + ) {} @Get('projects') @Public() @@ -47,4 +68,51 @@ export class ExploreController { showcase(@Param('project') project: string) { return this.projects.showcase(project); } + + @Post('projects/:project/proposals') + @Public() + @ApiParam({ + name: 'project', + description: 'Project id or key', + example: 'WEB', + }) + @ApiOperation({ + summary: 'Report a bug or propose an idea (no token needed)', + description: + 'For public projects that take proposals. It becomes a ticket labelled `propuesta`, opened by TaskStream in the first status (Bug or Feature), signed with `author` if given. Five per address every 15 minutes.', + }) + @ApiCreatedResponse({ type: ProposalResultDto }) + @ApiNotFoundResponse({ description: 'Not a public project' }) + @ApiForbiddenResponse({ description: 'It does not take proposals' }) + @ApiTooManyRequestsResponse({ description: 'Too many from this address' }) + async propose( + @Param('project') project: string, + @Body() body: ProposalDto, + @Req() req: Request, + ): Promise { + // Bots fill in every field: pretend it worked, and keep nothing. + if (body.website?.trim()) return { key: null, path: null }; + this.limiter.take(addressOf(req)); + const result = await this.projects.propose( + project, + body.kind, + body.title, + body.description ?? '', + body.author ?? null, + ); + const key = result.key ?? null; + return { + key, + path: key ? `/p/${key.split('-')[0]}/issues/${key}` : null, + }; + } +} + +/** Behind a proxy (Traefik, nginx), who asked comes in X-Forwarded-For. */ +function addressOf(req: Request): string { + const forwarded = req.headers['x-forwarded-for']; + const first = (Array.isArray(forwarded) ? forwarded[0] : forwarded) + ?.split(',')[0] + ?.trim(); + return first || req.ip || 'unknown'; } diff --git a/libs/api/tracker/presenters/src/lib/http/issues.controller.ts b/libs/api/tracker/presenters/src/lib/http/issues.controller.ts index 9f06f9f..c22116a 100644 --- a/libs/api/tracker/presenters/src/lib/http/issues.controller.ts +++ b/libs/api/tracker/presenters/src/lib/http/issues.controller.ts @@ -338,6 +338,45 @@ export class IssuesController { return this.issues.restore(me.id, await this.refs.issueId(me.id, issue)); } + @Put('issues/:issue/vote') + @ISSUE + @ApiOperation({ + summary: 'Vote for the ticket', + description: + 'Anyone signed in, on a public project (that is the point: the people it is for say what they want); members on a private one. Voting twice changes nothing.', + }) + @ApiOkResponse({ type: CommandResultDto }) + @ApiCommandErrors() + async vote(@CurrentUser() me: User, @Param('issue') issue: string) { + return this.issues.vote(me.id, await this.refs.issueId(me.id, issue), true); + } + + @Delete('issues/:issue/vote') + @ISSUE + @ApiOperation({ summary: 'Take back my vote for the ticket' }) + @ApiOkResponse({ type: CommandResultDto }) + @ApiCommandErrors() + async unvote(@CurrentUser() me: User, @Param('issue') issue: string) { + return this.issues.vote( + me.id, + await this.refs.issueId(me.id, issue), + false, + ); + } + + @Post('issues/:issue/duplicate') + @ISSUE + @ApiOperation({ + summary: 'Duplicate the ticket', + description: + 'Copies what it says (type, title, description, area, priority, labels, Figma, estimate, dates, parent and checklist steps, unticked), not where it stands: the copy starts in the first status, unassigned, out of sprints and releases, without comments or files. The result carries its key.', + }) + @ApiCreatedResponse({ type: CommandResultDto }) + @ApiCommandErrors() + async duplicate(@CurrentUser() me: User, @Param('issue') issue: string) { + return this.issues.duplicate(me.id, await this.refs.issueId(me.id, issue)); + } + @Get('projects/:project/trash') @ApiOptionalPireonAuth() @PROJECT diff --git a/libs/api/tracker/presenters/src/lib/http/proposal-limiter.ts b/libs/api/tracker/presenters/src/lib/http/proposal-limiter.ts new file mode 100644 index 0000000..e03f4f6 --- /dev/null +++ b/libs/api/tracker/presenters/src/lib/http/proposal-limiter.ts @@ -0,0 +1,33 @@ +import { HttpException, HttpStatus, Injectable } from '@nestjs/common'; + +/** Proposals from one address within the window. */ +const LIMIT = 5; +const WINDOW_MS = 15 * 60_000; + +/** + * Keeps one address from flooding a project with proposals. In memory: + * enough for one instance, and an approximation with several (each counts + * its own), which is fine for what it guards against. + */ +@Injectable() +export class ProposalLimiter { + private readonly sent = new Map(); + + take(address: string): void { + const now = Date.now(); + const recent = (this.sent.get(address) ?? []).filter( + (at) => now - at < WINDOW_MS, + ); + if (recent.length >= LIMIT) + throw new HttpException( + 'Too many proposals from here; try again in a few minutes', + HttpStatus.TOO_MANY_REQUESTS, + ); + recent.push(now); + this.sent.set(address, recent); + // Forget quiet addresses now and then, so the map does not grow forever. + if (this.sent.size > 10_000) + for (const [key, times] of this.sent) + if (times.every((at) => now - at >= WINDOW_MS)) this.sent.delete(key); + } +} diff --git a/libs/api/tracker/presenters/src/lib/http/refs.ts b/libs/api/tracker/presenters/src/lib/http/refs.ts index f213004..1ae2d6c 100644 --- a/libs/api/tracker/presenters/src/lib/http/refs.ts +++ b/libs/api/tracker/presenters/src/lib/http/refs.ts @@ -1,5 +1,6 @@ import { Injectable } from '@nestjs/common'; import { + BlockersService, IssuesService, ProjectsService, WorkflowsService, @@ -23,6 +24,7 @@ export class Refs { private readonly projects: ProjectsService, private readonly issues: IssuesService, private readonly workflows: WorkflowsService, + private readonly blockers: BlockersService, ) {} async projectId(viewerId: string | null, ref: string): Promise { @@ -35,12 +37,15 @@ export class Refs { return (await this.issues.findOne(viewerId, ref)).id; } - /** The ticket as the REST API returns it: read model + allowed transitions. */ + /** The ticket as the REST API returns it: read model, allowed transitions and what blocks it. */ async issueDto(issue: IssueReadModel) { - return { - ...issue, - allowedTransitions: await this.workflows.allowedTransitions(issue), - }; + const [allowedTransitions, blockedBy] = await Promise.all([ + this.workflows.allowedTransitions(issue), + this.blockers.blockedBy(issue), + ]); + // Who voted is only for telling someone whether they did. + const { voterIds: _voters, ...shown } = issue; + return { ...shown, allowedTransitions, blockedBy }; } issueDtos(issues: IssueReadModel[]) { diff --git a/libs/api/tracker/presenters/src/lib/tracker-presenters.module.ts b/libs/api/tracker/presenters/src/lib/tracker-presenters.module.ts index d064545..7ecf3d2 100644 --- a/libs/api/tracker/presenters/src/lib/tracker-presenters.module.ts +++ b/libs/api/tracker/presenters/src/lib/tracker-presenters.module.ts @@ -12,6 +12,7 @@ import { AttachmentsController } from './http/attachments.controller'; import { CommentsController } from './http/comments.controller'; import { IssuesController } from './http/issues.controller'; import { ExploreController } from './http/explore.controller'; +import { ProposalLimiter } from './http/proposal-limiter'; import { ProjectsController } from './http/projects.controller'; import { Refs } from './http/refs'; import { ReleasesController } from './http/releases.controller'; @@ -63,6 +64,7 @@ import { AutomationResolver } from './graphql/automation.resolver'; ], providers: [ Refs, + ProposalLimiter, ProjectResolver, IssueResolver, CommentResolver, diff --git a/libs/web/shared/ui/src/lib/icons.ts b/libs/web/shared/ui/src/lib/icons.ts index d299489..1203335 100644 --- a/libs/web/shared/ui/src/lib/icons.ts +++ b/libs/web/shared/ui/src/lib/icons.ts @@ -43,6 +43,7 @@ export const APP_ICONS: Record = { '', coins: '', + copy: '', document: '', email: diff --git a/libs/web/tracker/application/src/index.ts b/libs/web/tracker/application/src/index.ts index bacf5c3..556c893 100644 --- a/libs/web/tracker/application/src/index.ts +++ b/libs/web/tracker/application/src/index.ts @@ -8,3 +8,6 @@ export * from './lib/facades/explore.facade'; export * from './lib/facades/inbox.facade'; export * from './lib/facades/epics.facade'; export * from './lib/facades/backlog.facade'; +export * from './lib/facades/list.facade'; +export * from './lib/facades/propose.facade'; +export type { ListCriteria } from './lib/events/list.events'; diff --git a/libs/web/tracker/application/src/lib/events/epics.events.ts b/libs/web/tracker/application/src/lib/events/epics.events.ts index 76b6bd2..53e63cb 100644 --- a/libs/web/tracker/application/src/lib/events/epics.events.ts +++ b/libs/web/tracker/application/src/lib/events/epics.events.ts @@ -6,6 +6,7 @@ export const epicsPageEvents = eventGroup({ source: 'Epics Page', events: { opened: type<{ projectId: string }>(), + voteRequested: type<{ issueId: string; on: boolean }>(), }, }); @@ -14,5 +15,7 @@ export const epicsApiEvents = eventGroup({ events: { loaded: type(), loadFailed: type(), + voted: type(), + voteFailed: type(), }, }); diff --git a/libs/web/tracker/application/src/lib/events/issue.events.ts b/libs/web/tracker/application/src/lib/events/issue.events.ts index 6315147..a77134d 100644 --- a/libs/web/tracker/application/src/lib/events/issue.events.ts +++ b/libs/web/tracker/application/src/lib/events/issue.events.ts @@ -69,6 +69,10 @@ export const issuePageEvents = eventGroup({ attachmentId: string; }>(), commentEditRequested: type<{ commentId: string; body: string }>(), + reactRequested: type<{ commentId: string; emoji: string; on: boolean }>(), + voteRequested: type<{ issueId: string; on: boolean }>(), + /** An image pasted into a text was uploaded (it joins the ticket's files). */ + imagePasted: type<{ issueId: string }>(), commentDeleteRequested: type<{ commentId: string }>(), }, }); diff --git a/libs/web/tracker/application/src/lib/events/list.events.ts b/libs/web/tracker/application/src/lib/events/list.events.ts new file mode 100644 index 0000000..31fde4f --- /dev/null +++ b/libs/web/tracker/application/src/lib/events/list.events.ts @@ -0,0 +1,38 @@ +import { type } from '@ngrx/signals'; +import { eventGroup } from '@ngrx/signals/events'; +import { + BulkChange, + BulkResult, + IssueListFilter, + IssuePage, + IssuePriority, +} from '@task-stream/web/tracker/domain'; + +/** What the list shows, beyond the project. */ +export type ListCriteria = Omit; + +export const listPageEvents = eventGroup({ + source: 'List Page', + events: { + opened: type<{ projectId: string }>(), + filtered: type(), + statusChangeRequested: type<{ issueId: string; status: string }>(), + priorityChangeRequested: type<{ + issueId: string; + priority: IssuePriority; + }>(), + assignRequested: type<{ issueId: string; assigneeId: string | null }>(), + bulkRequested: type<{ issueIds: string[]; change: BulkChange }>(), + }, +}); + +export const listApiEvents = eventGroup({ + source: 'List API', + events: { + loaded: type(), + loadFailed: type(), + changed: type(), + changeFailed: type(), + bulkDone: type(), + }, +}); diff --git a/libs/web/tracker/application/src/lib/events/project.events.ts b/libs/web/tracker/application/src/lib/events/project.events.ts index 5068887..4dd58e4 100644 --- a/libs/web/tracker/application/src/lib/events/project.events.ts +++ b/libs/web/tracker/application/src/lib/events/project.events.ts @@ -48,6 +48,10 @@ export const projectPageEvents = eventGroup({ analyticsRequested: type<{ projectId: string; days: number }>(), burnupRequested: type<{ releaseId: string }>(), visibilityChangeRequested: type<{ projectId: string; isPublic: boolean }>(), + proposalsChangeRequested: type<{ + projectId: string; + acceptsProposals: boolean; + }>(), deleteRequested: type<{ projectId: string; confirmKey: string }>(), }, }); diff --git a/libs/web/tracker/application/src/lib/facades/epics.facade.ts b/libs/web/tracker/application/src/lib/facades/epics.facade.ts index 4f90474..bc026dc 100644 --- a/libs/web/tracker/application/src/lib/facades/epics.facade.ts +++ b/libs/web/tracker/application/src/lib/facades/epics.facade.ts @@ -19,6 +19,11 @@ export class EpicsFacade { open(projectId: string): void { this.dispatch.opened({ projectId }); } + + /** Votes for an epic (`on`) or takes the vote back. */ + vote(issueId: string, on: boolean): void { + this.dispatch.voteRequested({ issueId, on }); + } } /** Store + facade of the epics view, for its route component. */ diff --git a/libs/web/tracker/application/src/lib/facades/issue.facade.ts b/libs/web/tracker/application/src/lib/facades/issue.facade.ts index 83c470e..7c87028 100644 --- a/libs/web/tracker/application/src/lib/facades/issue.facade.ts +++ b/libs/web/tracker/application/src/lib/facades/issue.facade.ts @@ -4,10 +4,11 @@ import { Attachment, AttachmentsGateway, IssueLink, + IssuesGateway, IssueLinkType, UpdateIssueInput, } from '@task-stream/web/tracker/domain'; -import { Observable } from 'rxjs'; +import { map, Observable } from 'rxjs'; import { issuePageEvents } from '../events/issue.events'; import { IssueStore } from '../stores/issue.store'; @@ -20,6 +21,7 @@ export class IssueFacade { private readonly store = inject(IssueStore); private readonly dispatch = injectDispatch(issuePageEvents); private readonly files = inject(AttachmentsGateway); + private readonly issues = inject(IssuesGateway); readonly issue = this.store.issue; readonly comments = this.store.comments; @@ -178,6 +180,43 @@ export class IssueFacade { return this.files.download(issueId, attachment); } + /** A file's bytes by id alone (an image inside a description or comment). */ + fileById(attachmentId: string): Observable { + return this.fileOf({ id: attachmentId } as Attachment); + } + + /** + * Uploads an image pasted into a text and answers its id, to write + * `![name](attachment:)`. It also shows among the ticket's files. + */ + uploadImage(file: File): Observable { + const issueId = this.store.issue()?.id ?? ''; + return this.files.upload(issueId, file).pipe( + map((uploaded) => { + this.dispatch.imagePasted({ issueId }); + return uploaded.attachmentId; + }), + ); + } + + /** Votes for the open ticket (`on`) or takes the vote back. */ + vote(on: boolean): void { + this.withIssue((issueId) => this.dispatch.voteRequested({ issueId, on })); + } + + /** Adds (`on`) or takes back the signed-in person's reaction. */ + react(commentId: string, emoji: string, on: boolean): void { + this.dispatch.reactRequested({ commentId, emoji, on }); + } + + /** A copy of what the open ticket says; answers its key. */ + duplicate(): Observable { + const issueId = this.store.issue()?.id ?? ''; + return this.issues + .duplicate(issueId) + .pipe(map((result) => result.key ?? null)); + } + editComment(commentId: string, body: string): void { this.dispatch.commentEditRequested({ commentId, body }); } diff --git a/libs/web/tracker/application/src/lib/facades/list.facade.ts b/libs/web/tracker/application/src/lib/facades/list.facade.ts new file mode 100644 index 0000000..66316a0 --- /dev/null +++ b/libs/web/tracker/application/src/lib/facades/list.facade.ts @@ -0,0 +1,51 @@ +import { inject, Injectable, Provider } from '@angular/core'; +import { injectDispatch } from '@ngrx/signals/events'; +import { BulkChange, IssuePriority } from '@task-stream/web/tracker/domain'; +import { ListCriteria, listPageEvents } from '../events/list.events'; +import { LIST_LIMIT, ListStore } from '../stores/list.store'; + +/** The list view of a project, for presenters. */ +@Injectable() +export class ListFacade { + private readonly store = inject(ListStore); + private readonly dispatch = injectDispatch(listPageEvents); + + /** Most recently updated first (the first LIST_LIMIT). */ + readonly issues = this.store.issues; + readonly total = this.store.total; + readonly criteria = this.store.criteria; + readonly limit = LIST_LIMIT; + /** False until the first load: show skeletons, not empty states. */ + readonly loaded = this.store.loaded; + readonly error = this.store.error; + + open(projectId: string): void { + this.dispatch.opened({ projectId }); + } + + filter(criteria: ListCriteria): void { + this.dispatch.filtered(criteria); + } + + changeStatus(issueId: string, status: string): void { + this.dispatch.statusChangeRequested({ issueId, status }); + } + + changePriority(issueId: string, priority: IssuePriority): void { + this.dispatch.priorityChangeRequested({ issueId, priority }); + } + + assign(issueId: string, assigneeId: string | null): void { + this.dispatch.assignRequested({ issueId, assigneeId }); + } + + /** The same change on several tickets (each may refuse on its own). */ + bulkUpdate(issueIds: string[], change: BulkChange): void { + if (issueIds.length) this.dispatch.bulkRequested({ issueIds, change }); + } +} + +/** Store + facade of the list view, for its route component. */ +export function provideListFacade(): Provider[] { + return [ListStore, ListFacade]; +} diff --git a/libs/web/tracker/application/src/lib/facades/project.facade.ts b/libs/web/tracker/application/src/lib/facades/project.facade.ts index df47b6c..c1ad6f3 100644 --- a/libs/web/tracker/application/src/lib/facades/project.facade.ts +++ b/libs/web/tracker/application/src/lib/facades/project.facade.ts @@ -161,6 +161,13 @@ export class ProjectFacade { this.dispatch.visibilityChangeRequested({ projectId, isPublic }); } + /** Take bug reports and ideas from anyone (while public). Owners and admins. */ + setAcceptsProposals(acceptsProposals: boolean): void { + const projectId = this.projectId(); + if (projectId) + this.dispatch.proposalsChangeRequested({ projectId, acceptsProposals }); + } + /** * Owner only, typing the key to confirm. Tickets, comments and releases go * too; on success it navigates home. diff --git a/libs/web/tracker/application/src/lib/facades/propose.facade.ts b/libs/web/tracker/application/src/lib/facades/propose.facade.ts new file mode 100644 index 0000000..7f3608b --- /dev/null +++ b/libs/web/tracker/application/src/lib/facades/propose.facade.ts @@ -0,0 +1,20 @@ +import { inject, Injectable } from '@angular/core'; +import { + ProposalInput, + ProposalResult, + ProposalsGateway, +} from '@task-stream/web/tracker/domain'; +import { Observable } from 'rxjs'; + +/** The public form of a project: anyone reports a bug or proposes an idea. */ +@Injectable({ providedIn: 'root' }) +export class ProposeFacade { + private readonly proposals = inject(ProposalsGateway); + + submit( + projectKey: string, + proposal: ProposalInput, + ): Observable { + return this.proposals.submit(projectKey, proposal); + } +} diff --git a/libs/web/tracker/application/src/lib/stores/epics.store.ts b/libs/web/tracker/application/src/lib/stores/epics.store.ts index 87b8bd5..50ceb69 100644 --- a/libs/web/tracker/application/src/lib/stores/epics.store.ts +++ b/libs/web/tracker/application/src/lib/stores/epics.store.ts @@ -12,9 +12,9 @@ import { IssuesGateway, TrackerRealtimeGateway, } from '@task-stream/web/tracker/domain'; -import { debounceTime, startWith, switchMap } from 'rxjs'; +import { debounceTime, merge, mergeMap, startWith, switchMap, tap } from 'rxjs'; import { epicsApiEvents, epicsPageEvents } from '../events/epics.events'; -import { describeError } from '../notifications'; +import { describeError, Notifications } from '../notifications'; interface EpicsState { epics: Epic[]; @@ -42,11 +42,16 @@ export const EpicsStore = signalStore( events = inject(Events), issues = inject(IssuesGateway), realtime = inject(TrackerRealtimeGateway), + notifications = inject(Notifications), ) => ({ // Any ticket of the project may move an epic's progress: reload, calmly. load$: events.on(epicsPageEvents.opened).pipe( switchMap(({ payload }) => - realtime.issueChanges(payload.projectId).pipe( + merge( + realtime.issueChanges(payload.projectId), + // One's own vote, without waiting for the live update. + events.on(epicsApiEvents.voted), + ).pipe( debounceTime(500), startWith(null), switchMap(() => @@ -61,6 +66,19 @@ export const EpicsStore = signalStore( ), ), ), + vote$: events.on(epicsPageEvents.voteRequested).pipe( + mergeMap(({ payload }) => + issues.vote(payload.issueId, payload.on).pipe( + mapResponse({ + next: () => epicsApiEvents.voted(), + error: (error) => epicsApiEvents.voteFailed(describeError(error)), + }), + ), + ), + ), + voteFeedback$: events + .on(epicsApiEvents.voteFailed) + .pipe(tap(({ payload }) => notifications.error(payload))), }), ), ); diff --git a/libs/web/tracker/application/src/lib/stores/issue.store.ts b/libs/web/tracker/application/src/lib/stores/issue.store.ts index 1e620af..72b13ad 100644 --- a/libs/web/tracker/application/src/lib/stores/issue.store.ts +++ b/libs/web/tracker/application/src/lib/stores/issue.store.ts @@ -244,7 +244,11 @@ export const IssueStore = signalStore( * ticket, its comments and its subtasks are asked for twice. */ catchUp$: events - .on(issueApiEvents.commandSucceeded, issueApiEvents.checklistSaved) + .on( + issueApiEvents.commandSucceeded, + issueApiEvents.checklistSaved, + issuePageEvents.imagePasted, + ) .pipe( map(() => store.issue()), filter((issue): issue is Issue => !!issue), @@ -391,6 +395,30 @@ export const IssueStore = signalStore( ), ), ), + events.on(issuePageEvents.voteRequested).pipe( + mergeMap(({ payload }) => + issues.vote(payload.issueId, payload.on).pipe( + // The count is the feedback. + mapResponse({ + next: () => issueApiEvents.checklistSaved(), + error: (error) => + issueApiEvents.commandFailed(describeError(error)), + }), + ), + ), + ), + events.on(issuePageEvents.reactRequested).pipe( + mergeMap(({ payload }) => + comments.react(payload.commentId, payload.emoji, payload.on).pipe( + // A reaction is not worth a toast either. + mapResponse({ + next: () => issueApiEvents.checklistSaved(), + error: (error) => + issueApiEvents.commandFailed(describeError(error)), + }), + ), + ), + ), events.on(issuePageEvents.checklistUpdateRequested).pipe( mergeMap(({ payload }) => issues diff --git a/libs/web/tracker/application/src/lib/stores/list.store.ts b/libs/web/tracker/application/src/lib/stores/list.store.ts new file mode 100644 index 0000000..2bc0136 --- /dev/null +++ b/libs/web/tracker/application/src/lib/stores/list.store.ts @@ -0,0 +1,183 @@ +import { inject } from '@angular/core'; +import { mapResponse } from '@ngrx/operators'; +import { signalStore, withState } from '@ngrx/signals'; +import { + Events, + on, + withEventHandlers, + withReducer, +} from '@ngrx/signals/events'; +import { + IssuesGateway, + IssueSummary, + TrackerRealtimeGateway, +} from '@task-stream/web/tracker/domain'; +import { + combineLatest, + concatMap, + debounceTime, + map, + merge, + mergeMap, + startWith, + switchMap, + tap, +} from 'rxjs'; +import { + ListCriteria, + listApiEvents, + listPageEvents, +} from '../events/list.events'; +import { describeError, Notifications } from '../notifications'; + +/** The list asks for this many at most; past that, the filters narrow it. */ +export const LIST_LIMIT = 200; + +interface ListState { + projectId: string | null; + criteria: ListCriteria; + issues: IssueSummary[]; + total: number; + loaded: boolean; + error: string | null; +} + +/** Every ticket of a project that fits the filters, as rows. Live. */ +export const ListStore = signalStore( + withState({ + projectId: null, + criteria: {}, + issues: [], + total: 0, + loaded: false, + error: null, + }), + withReducer( + on(listPageEvents.opened, ({ payload }) => ({ + projectId: payload.projectId, + loaded: false, + error: null, + })), + on(listPageEvents.filtered, ({ payload }) => ({ criteria: payload })), + on(listApiEvents.loaded, ({ payload }) => ({ + issues: payload.items, + total: payload.total, + loaded: true, + error: null, + })), + on(listApiEvents.loadFailed, ({ payload }) => ({ + loaded: true, + error: payload, + })), + ), + withEventHandlers( + ( + store, + events = inject(Events), + issues = inject(IssuesGateway), + realtime = inject(TrackerRealtimeGateway), + notifications = inject(Notifications), + ) => { + const command = (request: ReturnType) => + request.pipe( + mapResponse({ + next: () => listApiEvents.changed(), + error: (error) => listApiEvents.changeFailed(describeError(error)), + }), + ); + return { + /** + * Reloads on opening, on each filter and on anyone's change (calmly); + * also after this page's own changes, not to wait for the live one. + */ + load$: events.on(listPageEvents.opened).pipe( + switchMap(({ payload }) => + combineLatest([ + events.on(listPageEvents.filtered).pipe( + map(({ payload: criteria }) => criteria), + startWith(store.criteria()), + debounceTime(250), + ), + merge( + realtime.issueChanges(payload.projectId), + events.on( + listApiEvents.changed, + listApiEvents.changeFailed, + listApiEvents.bulkDone, + ), + ).pipe(debounceTime(400), startWith(null)), + ]).pipe( + switchMap(([criteria]) => + issues + .list({ + ...criteria, + projectId: payload.projectId, + limit: LIST_LIMIT, + }) + .pipe( + mapResponse({ + next: (page) => listApiEvents.loaded(page), + error: (error) => + listApiEvents.loadFailed(describeError(error)), + }), + ), + ), + ), + ), + ), + status$: events.on(listPageEvents.statusChangeRequested).pipe( + mergeMap(({ payload }) => + command( + issues.changeStatus({ + issueId: payload.issueId, + status: payload.status, + }), + ), + ), + ), + priority$: events.on(listPageEvents.priorityChangeRequested).pipe( + mergeMap(({ payload }) => + command( + issues.update({ + issueId: payload.issueId, + priority: payload.priority, + }), + ), + ), + ), + assign$: events + .on(listPageEvents.assignRequested) + .pipe( + mergeMap(({ payload }) => + command(issues.assign(payload.issueId, payload.assigneeId)), + ), + ), + bulk$: events.on(listPageEvents.bulkRequested).pipe( + concatMap(({ payload }) => + issues.bulkUpdate(payload.issueIds, payload.change).pipe( + mapResponse({ + next: (result) => listApiEvents.bulkDone(result), + error: (error) => + listApiEvents.changeFailed(describeError(error)), + }), + ), + ), + ), + bulkFeedback$: events.on(listApiEvents.bulkDone).pipe( + tap(({ payload }) => { + const refused = payload.results.filter((r) => !r.ok); + if (!refused.length) + notifications.success(`${payload.updated} tickets actualizados`); + else + notifications.error( + `${payload.updated} actualizados; ${refused.length} no: ${refused[0].error}`, + ); + }), + ), + feedback$: events + .on(listApiEvents.changeFailed) + .pipe(tap(({ payload }) => notifications.error(payload))), + }; + }, + ), +); diff --git a/libs/web/tracker/application/src/lib/stores/project.store.ts b/libs/web/tracker/application/src/lib/stores/project.store.ts index f2e8e11..1eb6a45 100644 --- a/libs/web/tracker/application/src/lib/stores/project.store.ts +++ b/libs/web/tracker/application/src/lib/stores/project.store.ts @@ -419,6 +419,20 @@ export const ProjectStore = signalStore( ), ), ), + events + .on(projectPageEvents.proposalsChangeRequested) + .pipe( + mergeMap(({ payload }) => + runCommand( + projects.update(payload), + payload.acceptsProposals + ? 'Formulario público abierto: cualquiera puede proponer' + : 'Formulario público cerrado', + projectApiEvents.commandSucceeded, + projectApiEvents.commandFailed, + ), + ), + ), events .on(projectPageEvents.releaseCreateRequested) .pipe( diff --git a/libs/web/tracker/domain/src/lib/models/enums.ts b/libs/web/tracker/domain/src/lib/models/enums.ts index d68db3b..a548ec8 100644 --- a/libs/web/tracker/domain/src/lib/models/enums.ts +++ b/libs/web/tracker/domain/src/lib/models/enums.ts @@ -58,3 +58,6 @@ export enum NotificationKind { ADDED_TO_PROJECT = 'ADDED_TO_PROJECT', REMINDER = 'REMINDER', } + +/** The reactions a comment takes, in the order they are offered (GitHub's). */ +export const REACTIONS = ['👍', '👎', '😄', '🎉', '😕', '❤️', '🚀', '👀']; diff --git a/libs/web/tracker/domain/src/lib/models/inputs.ts b/libs/web/tracker/domain/src/lib/models/inputs.ts index 33986f7..03a7981 100644 --- a/libs/web/tracker/domain/src/lib/models/inputs.ts +++ b/libs/web/tracker/domain/src/lib/models/inputs.ts @@ -17,6 +17,24 @@ export interface UpdateProjectInput { name?: string; description?: string | null; isPublic?: boolean; + acceptsProposals?: boolean; +} + +/** A bug report or an idea from anyone, through a public project's form. */ +export interface ProposalInput { + kind: 'BUG' | 'IDEA'; + title: string; + description: string; + /** How they sign it (optional; no e-mail: it would be public). */ + author: string; + /** Left empty by people; bots fill it in. */ + website: string; +} + +export interface ProposalResult { + /** The ticket it became (null when it was dropped as spam). */ + key: string | null; + path: string | null; } export interface CreateIssueInput { @@ -68,6 +86,19 @@ export interface CreateReleaseInput { targetDate?: string | null; } +/** The list view of a project: every ticket that fits, any status. */ +export interface IssueListFilter { + projectId: string; + /** Matches key, title or description. */ + search?: string; + categories?: StatusCategory[]; + types?: string[]; + priorities?: IssuePriority[]; + assigneeId?: string; + unassigned?: boolean; + limit: number; +} + /** "My work": tickets across all my projects. */ export interface MyIssuesFilter { /** true: assigned to me. false: any ticket of my projects. */ diff --git a/libs/web/tracker/domain/src/lib/models/models.ts b/libs/web/tracker/domain/src/lib/models/models.ts index e2a8c99..e7bff1b 100644 --- a/libs/web/tracker/domain/src/lib/models/models.ts +++ b/libs/web/tracker/domain/src/lib/models/models.ts @@ -26,6 +26,8 @@ export interface Project { description: string | null; /** Anyone can read it, also without signing in. */ isPublic: boolean; + /** Takes bug reports and ideas from anyone (while public). */ + acceptsProposals: boolean; owner: UserRef; members: ProjectMember[]; settings: ProjectSettings; @@ -112,6 +114,11 @@ export interface IssueSummary { labels: string[]; /** The epic or ticket this one breaks down. */ parent: IssueParent | null; + /** Open tickets it waits for: the ones that block it or it depends on. */ + blockedBy: IssueParent[]; + /** How many want it done, and whether I am one of them. */ + votes: number; + voted: boolean; /** Place in the backlog and in its board column (ascending, as text). */ rank: string; /** Estimate; null when nobody estimated it. */ @@ -275,6 +282,8 @@ export interface Comment { replyTo: string | null; /** Deleted, but kept (without its text) while it has replies. */ deleted: boolean; + /** 👍… and who chose each (only the ones somebody chose). */ + reactions: { emoji: string; users: UserRef[] }[]; createdAt: string; editedAt: string | null; } diff --git a/libs/web/tracker/domain/src/lib/ports/gateways.ts b/libs/web/tracker/domain/src/lib/ports/gateways.ts index d07d8d1..2792086 100644 --- a/libs/web/tracker/domain/src/lib/ports/gateways.ts +++ b/libs/web/tracker/domain/src/lib/ports/gateways.ts @@ -38,6 +38,9 @@ import { CreateReleaseInput, LinkIssuesInput, MemberInput, + IssueListFilter, + ProposalInput, + ProposalResult, MyIssuesFilter, UpdateIssueInput, UpdateProjectInput, @@ -88,9 +91,15 @@ export abstract class IssuesGateway { abstract board(filter: BoardFilter): Observable; abstract issue(idOrKey: string): Observable; abstract search(projectId: string, text: string): Observable; + /** A project's tickets for the list view (most recently updated first). */ + abstract list(filter: IssueListFilter): Observable; /** Tickets across all my projects (most recently updated first). */ abstract mine(filter: MyIssuesFilter): Observable; abstract create(input: CreateIssueInput): Observable; + /** Votes for it (`on`) or takes the vote back. */ + abstract vote(issueId: string, on: boolean): Observable; + /** A copy of what the ticket says; the result carries its key. */ + abstract duplicate(issueId: string): Observable; abstract update(input: UpdateIssueInput): Observable; abstract changeStatus(input: ChangeStatusInput): Observable; abstract assign( @@ -236,16 +245,33 @@ export abstract class CommentsGateway { replyTo?: string | null, ): Observable; abstract edit(commentId: string, body: string): Observable; + /** Adds (`on`) or takes back one's reaction. */ + abstract react( + commentId: string, + emoji: string, + on: boolean, + ): Observable; abstract remove(commentId: string): Observable; } /** A ticket's files. Uploads and downloads go through the REST API. */ +/** The ticket's acknowledgement and the new file's id. */ +export type AttachmentUploaded = CommandResult & { attachmentId: string }; + +/** The public form: no session needed. */ +export abstract class ProposalsGateway { + abstract submit( + projectKey: string, + proposal: ProposalInput, + ): Observable; +} + export abstract class AttachmentsGateway { abstract upload( issueId: string, file: File, commentId?: string | null, - ): Observable; + ): Observable; /** The file's bytes, to show (images) or save. */ abstract download(issueId: string, attachment: Attachment): Observable; abstract remove( diff --git a/libs/web/tracker/infrastructure/src/lib/adapters/graphql-collaboration.gateways.ts b/libs/web/tracker/infrastructure/src/lib/adapters/graphql-collaboration.gateways.ts index 166505b..84f4ac5 100644 --- a/libs/web/tracker/infrastructure/src/lib/adapters/graphql-collaboration.gateways.ts +++ b/libs/web/tracker/infrastructure/src/lib/adapters/graphql-collaboration.gateways.ts @@ -21,6 +21,7 @@ import { DeleteCommentDocument, EditCommentDocument, IssueCommentsDocument, + ReactToCommentDocument, PublishReleaseDocument, ReleaseBurnupDocument, ReleaseNotesDraftDocument, @@ -52,6 +53,16 @@ export class GraphqlCommentsGateway extends CommentsGateway { .pipe(map((d) => toCommandResult(d.addComment))); } + react( + commentId: string, + emoji: string, + on: boolean, + ): Observable { + return this.gql + .mutate(ReactToCommentDocument, { commentId, emoji, on }) + .pipe(map((d) => toCommandResult(d.reactToComment))); + } + edit(commentId: string, body: string): Observable { return this.gql .mutate(EditCommentDocument, { commentId, body }) diff --git a/libs/web/tracker/infrastructure/src/lib/adapters/graphql-issues.gateway.ts b/libs/web/tracker/infrastructure/src/lib/adapters/graphql-issues.gateway.ts index 06866d3..a93d295 100644 --- a/libs/web/tracker/infrastructure/src/lib/adapters/graphql-issues.gateway.ts +++ b/libs/web/tracker/infrastructure/src/lib/adapters/graphql-issues.gateway.ts @@ -11,6 +11,7 @@ import { Issue, IssuePage, IssuesGateway, + IssueListFilter, IssueSummary, LinkIssuesInput, MyIssuesFilter, @@ -25,10 +26,12 @@ import { BoardDocument, ChangeIssueStatusDocument, CreateIssueDocument, + DuplicateIssueDocument, DueIssuesDocument, EpicsDocument, IssueChildrenDocument, IssueDocument, + IssueListDocument, LinkIssuesDocument, MyIssuesDocument, RankIssueDocument, @@ -41,6 +44,7 @@ import { SetIssueReleaseDocument, UnlinkIssuesDocument, UnwatchIssueDocument, + VoteIssueDocument, WatchIssueDocument, UpdateChecklistItemDocument, UpdateIssueDocument, @@ -102,6 +106,24 @@ export class GraphqlIssuesGateway extends IssuesGateway { ); } + list(filter: IssueListFilter): Observable { + const { limit, ...criteria } = filter; + return this.gql + .query(IssueListDocument, { + filter: { + ...criteria, + search: criteria.search?.trim() || undefined, + } as never, + limit, + }) + .pipe( + map((d) => ({ + items: d.issues.items.map(toIssueSummary), + total: d.issues.total, + })), + ); + } + search(projectId: string, text: string): Observable { return this.gql .query(SearchIssuesDocument, { filter: { projectId, search: text } }) @@ -114,6 +136,12 @@ export class GraphqlIssuesGateway extends IssuesGateway { .pipe(map((d) => toCommandResult(d.createIssue))); } + duplicate(issueId: string): Observable { + return this.gql + .mutate(DuplicateIssueDocument, { issueId }) + .pipe(map((d) => toCommandResult(d.duplicateIssue))); + } + update(input: UpdateIssueInput): Observable { return this.gql .mutate(UpdateIssueDocument, { input: input as never }) @@ -147,6 +175,12 @@ export class GraphqlIssuesGateway extends IssuesGateway { .pipe(map((d) => toCommandResult(d.unlinkIssues))); } + vote(issueId: string, on: boolean): Observable { + return this.gql + .mutate(VoteIssueDocument, { issueId, on }) + .pipe(map((d) => toCommandResult(d.voteIssue))); + } + watch(issueId: string, watching: boolean): Observable { return watching ? this.gql diff --git a/libs/web/tracker/infrastructure/src/lib/adapters/http-attachments.gateway.ts b/libs/web/tracker/infrastructure/src/lib/adapters/http-attachments.gateway.ts index 900e89b..7ccb72a 100644 --- a/libs/web/tracker/infrastructure/src/lib/adapters/http-attachments.gateway.ts +++ b/libs/web/tracker/infrastructure/src/lib/adapters/http-attachments.gateway.ts @@ -7,6 +7,7 @@ import { import { Attachment, AttachmentsGateway, + AttachmentUploaded, CommandResult, } from '@task-stream/web/tracker/domain'; import { from, Observable, switchMap } from 'rxjs'; @@ -25,12 +26,14 @@ export class HttpAttachmentsGateway extends AttachmentsGateway { issueId: string, file: File, commentId?: string | null, - ): Observable { + ): Observable { const body = new FormData(); body.append('file', file, file.name); if (commentId) body.append('commentId', commentId); return this.authorized((headers) => - this.http.post(this.url(issueId), body, { headers }), + this.http.post(this.url(issueId), body, { + headers, + }), ); } diff --git a/libs/web/tracker/infrastructure/src/lib/adapters/http-proposals.gateway.ts b/libs/web/tracker/infrastructure/src/lib/adapters/http-proposals.gateway.ts new file mode 100644 index 0000000..5e5be31 --- /dev/null +++ b/libs/web/tracker/infrastructure/src/lib/adapters/http-proposals.gateway.ts @@ -0,0 +1,30 @@ +import { HttpClient } from '@angular/common/http'; +import { inject, Injectable } from '@angular/core'; +import { API_CONFIG } from '@task-stream/web/shared/infrastructure'; +import { + ProposalInput, + ProposalResult, + ProposalsGateway, +} from '@task-stream/web/tracker/domain'; +import { Observable } from 'rxjs'; + +/** The public form posts over REST, without a session (`/api/explore/...`). */ +@Injectable() +export class HttpProposalsGateway extends ProposalsGateway { + private readonly http = inject(HttpClient); + private readonly api = inject(API_CONFIG); + + submit( + projectKey: string, + proposal: ProposalInput, + ): Observable { + return this.http.post( + `${this.api.restUrl}/explore/projects/${encodeURIComponent(projectKey)}/proposals`, + { + ...proposal, + description: proposal.description.trim() || undefined, + author: proposal.author.trim() || undefined, + }, + ); + } +} diff --git a/libs/web/tracker/infrastructure/src/lib/graphql/fragments.graphql b/libs/web/tracker/infrastructure/src/lib/graphql/fragments.graphql index 7d51016..bf73046 100644 --- a/libs/web/tracker/infrastructure/src/lib/graphql/fragments.graphql +++ b/libs/web/tracker/infrastructure/src/lib/graphql/fragments.graphql @@ -9,6 +9,7 @@ fragment ProjectFields on Project { name description isPublic + acceptsProposals updatedAt version owner { @@ -83,6 +84,13 @@ fragment IssueSummaryFields on Issue { key title } + blockedBy { + id + key + title + } + votes + voted rank storyPoints startDate @@ -143,6 +151,12 @@ fragment CommentFields on Comment { body replyTo deleted + reactions { + emoji + users { + ...UserRefFields + } + } createdAt editedAt author { diff --git a/libs/web/tracker/infrastructure/src/lib/graphql/generated.ts b/libs/web/tracker/infrastructure/src/lib/graphql/generated.ts index 62271fe..b0b5349 100644 --- a/libs/web/tracker/infrastructure/src/lib/graphql/generated.ts +++ b/libs/web/tracker/infrastructure/src/lib/graphql/generated.ts @@ -1,7 +1,11 @@ /** Internal type. DO NOT USE DIRECTLY. */ type Exact = { [K in keyof T]: T[K] }; /** Internal type. DO NOT USE DIRECTLY. */ -export type Incremental = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never }; +export type Incremental = + | T + | { + [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never; + }; import type { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core'; export type AddChecklistItemInput = { issueId: string; @@ -137,15 +141,9 @@ export type CreateWebhookInput = { url: string; }; -export type DevLinkKind = - | 'BRANCH' - | 'COMMIT' - | 'PULL_REQUEST'; +export type DevLinkKind = 'BRANCH' | 'COMMIT' | 'PULL_REQUEST'; -export type DevLinkState = - | 'CLOSED' - | 'MERGED' - | 'OPEN'; +export type DevLinkState = 'CLOSED' | 'MERGED' | 'OPEN'; export type IssueFilterInput = { areas?: Array | null | undefined; @@ -181,17 +179,10 @@ export type IssueLinkType = | 'RELATES_TO' | 'TESTS'; -export type IssuePriority = - | 'CRITICAL' - | 'HIGH' - | 'LOW' - | 'LOWEST' - | 'MEDIUM'; +export type IssuePriority = 'CRITICAL' | 'HIGH' | 'LOW' | 'LOWEST' | 'MEDIUM'; /** RECENT: last updated first. RANK: backlog order. */ -export type IssueSort = - | 'RANK' - | 'RECENT'; +export type IssueSort = 'RANK' | 'RECENT'; export type IssueTemplateInput = { checklist?: Array; @@ -207,9 +198,7 @@ export type IssueTypeOptionInput = { template?: IssueTemplateInput | null | undefined; }; -export type LinkDirection = - | 'INWARD' - | 'OUTWARD'; +export type LinkDirection = 'INWARD' | 'OUTWARD'; export type LinkIssuesInput = { issueId: string; @@ -236,11 +225,7 @@ export type ProjectMemberInput = { userId: string; }; -export type ProjectRole = - | 'ADMIN' - | 'MEMBER' - | 'OWNER' - | 'VIEWER'; +export type ProjectRole = 'ADMIN' | 'MEMBER' | 'OWNER' | 'VIEWER'; /** The whole configuration (replaces the previous one). Statuses go in board order. */ export type ProjectSettingsInput = { @@ -258,10 +243,7 @@ export type RankIssueInput = { issueId: string; }; -export type ReleaseStatus = - | 'ARCHIVED' - | 'PLANNED' - | 'RELEASED'; +export type ReleaseStatus = 'ARCHIVED' | 'PLANNED' | 'RELEASED'; export type SaveFilterInput = { criteria: SavedFilterCriteriaInput; @@ -283,10 +265,7 @@ export type SavedFilterCriteriaInput = { }; /** PLANNED, ACTIVE (one per project at a time) or CLOSED */ -export type SprintStatus = - | 'ACTIVE' - | 'CLOSED' - | 'PLANNED'; +export type SprintStatus = 'ACTIVE' | 'CLOSED' | 'PLANNED'; /** What a status means, whatever each project calls it. DONE and CANCELLED are finished. */ export type StatusCategory = @@ -326,6 +305,8 @@ export type UpdateIssueInput = { }; export type UpdateProjectInput = { + /** Take bug reports and ideas from anyone through the public form (while public) */ + acceptsProposals?: boolean | null | undefined; description?: string | null | undefined; isPublic?: boolean | null | undefined; name?: string | null | undefined; @@ -358,21 +339,71 @@ export type WorkflowStatusInput = { wipLimit?: number | null | undefined; }; -export type AutomationFieldsFragment = { id: string, name: string, active: boolean, runs: number, lastRunAt: string | null, lastError: string | null, trigger: { kind: AutomationTrigger, status: string | null }, conditions: { types: Array | null, priorities: Array | null, areas: Array | null, label: string | null }, action: { kind: AutomationAction, value: string | null }, createdBy: { id: string, name: string } }; +export type AutomationFieldsFragment = { + id: string; + name: string; + active: boolean; + runs: number; + lastRunAt: string | null; + lastError: string | null; + trigger: { kind: AutomationTrigger; status: string | null }; + conditions: { + types: Array | null; + priorities: Array | null; + areas: Array | null; + label: string | null; + }; + action: { kind: AutomationAction; value: string | null }; + createdBy: { id: string; name: string }; +}; export type AutomationsQueryVariables = Exact<{ projectId: string; }>; - -export type AutomationsQuery = { automations: Array<{ id: string, name: string, active: boolean, runs: number, lastRunAt: string | null, lastError: string | null, trigger: { kind: AutomationTrigger, status: string | null }, conditions: { types: Array | null, priorities: Array | null, areas: Array | null, label: string | null }, action: { kind: AutomationAction, value: string | null }, createdBy: { id: string, name: string } }> }; +export type AutomationsQuery = { + automations: Array<{ + id: string; + name: string; + active: boolean; + runs: number; + lastRunAt: string | null; + lastError: string | null; + trigger: { kind: AutomationTrigger; status: string | null }; + conditions: { + types: Array | null; + priorities: Array | null; + areas: Array | null; + label: string | null; + }; + action: { kind: AutomationAction; value: string | null }; + createdBy: { id: string; name: string }; + }>; +}; export type CreateAutomationMutationVariables = Exact<{ input: CreateAutomationInput; }>; - -export type CreateAutomationMutation = { createAutomation: { id: string, name: string, active: boolean, runs: number, lastRunAt: string | null, lastError: string | null, trigger: { kind: AutomationTrigger, status: string | null }, conditions: { types: Array | null, priorities: Array | null, areas: Array | null, label: string | null }, action: { kind: AutomationAction, value: string | null }, createdBy: { id: string, name: string } } }; +export type CreateAutomationMutation = { + createAutomation: { + id: string; + name: string; + active: boolean; + runs: number; + lastRunAt: string | null; + lastError: string | null; + trigger: { kind: AutomationTrigger; status: string | null }; + conditions: { + types: Array | null; + priorities: Array | null; + areas: Array | null; + label: string | null; + }; + action: { kind: AutomationAction; value: string | null }; + createdBy: { id: string; name: string }; + }; +}; export type UpdateAutomationMutationVariables = Exact<{ automationId: string; @@ -380,63 +411,256 @@ export type UpdateAutomationMutationVariables = Exact<{ active?: boolean | null | undefined; }>; - -export type UpdateAutomationMutation = { updateAutomation: { id: string, name: string, active: boolean, runs: number, lastRunAt: string | null, lastError: string | null, trigger: { kind: AutomationTrigger, status: string | null }, conditions: { types: Array | null, priorities: Array | null, areas: Array | null, label: string | null }, action: { kind: AutomationAction, value: string | null }, createdBy: { id: string, name: string } } }; +export type UpdateAutomationMutation = { + updateAutomation: { + id: string; + name: string; + active: boolean; + runs: number; + lastRunAt: string | null; + lastError: string | null; + trigger: { kind: AutomationTrigger; status: string | null }; + conditions: { + types: Array | null; + priorities: Array | null; + areas: Array | null; + label: string | null; + }; + action: { kind: AutomationAction; value: string | null }; + createdBy: { id: string; name: string }; + }; +}; export type DeleteAutomationMutationVariables = Exact<{ automationId: string; }>; - export type DeleteAutomationMutation = { deleteAutomation: boolean }; -export type UserRefFieldsFragment = { id: string, name: string }; +export type UserRefFieldsFragment = { id: string; name: string }; -export type ProjectFieldsFragment = { id: string, key: string, name: string, description: string | null, isPublic: boolean, updatedAt: string, version: number, owner: { id: string, name: string }, members: Array<{ role: ProjectRole, user: { id: string, name: string } }>, settings: { statuses: Array<{ id: string, name: string, category: StatusCategory, color: string, requiresReason: boolean, archived: boolean, wipLimit: number | null }>, transitions: Array<{ from: string, to: Array }>, issueTypes: Array<{ id: string, name: string, icon: string, color: string, archived: boolean, template: { description: string | null, checklist: Array } | null }>, areas: Array<{ id: string, name: string, archived: boolean }> } }; +export type ProjectFieldsFragment = { + id: string; + key: string; + name: string; + description: string | null; + isPublic: boolean; + acceptsProposals: boolean; + updatedAt: string; + version: number; + owner: { id: string; name: string }; + members: Array<{ role: ProjectRole; user: { id: string; name: string } }>; + settings: { + statuses: Array<{ + id: string; + name: string; + category: StatusCategory; + color: string; + requiresReason: boolean; + archived: boolean; + wipLimit: number | null; + }>; + transitions: Array<{ from: string; to: Array }>; + issueTypes: Array<{ + id: string; + name: string; + icon: string; + color: string; + archived: boolean; + template: { description: string | null; checklist: Array } | null; + }>; + areas: Array<{ id: string; name: string; archived: boolean }>; + }; +}; -export type IssueSummaryFieldsFragment = { id: string, projectId: string, key: string, type: string, area: string | null, title: string, status: string, statusCategory: StatusCategory, priority: IssuePriority, labels: Array, commentCount: number, updatedAt: string, version: number, rank: string, storyPoints: number | null, startDate: string | null, dueDate: string | null, trashedAt: string | null, assignee: { id: string, name: string } | null, release: { id: string, name: string } | null, sprint: { id: string, name: string } | null, parent: { id: string, key: string, title: string } | null }; +export type IssueSummaryFieldsFragment = { + id: string; + projectId: string; + key: string; + type: string; + area: string | null; + title: string; + status: string; + statusCategory: StatusCategory; + priority: IssuePriority; + labels: Array; + commentCount: number; + updatedAt: string; + version: number; + votes: number; + voted: boolean; + rank: string; + storyPoints: number | null; + startDate: string | null; + dueDate: string | null; + trashedAt: string | null; + assignee: { id: string; name: string } | null; + release: { id: string; name: string } | null; + sprint: { id: string; name: string } | null; + parent: { id: string; key: string; title: string } | null; + blockedBy: Array<{ id: string; key: string; title: string }>; +}; -export type IssueFieldsFragment = { description: string | null, figmaUrl: string | null, createdAt: string, allowedTransitions: Array, id: string, projectId: string, key: string, type: string, area: string | null, title: string, status: string, statusCategory: StatusCategory, priority: IssuePriority, labels: Array, commentCount: number, updatedAt: string, version: number, rank: string, storyPoints: number | null, startDate: string | null, dueDate: string | null, trashedAt: string | null, reporter: { id: string, name: string }, links: Array<{ type: IssueLinkType, direction: LinkDirection, issueId: string, issueKey: string }>, watchers: Array<{ id: string, name: string }>, checklist: Array<{ id: string, text: string, done: boolean }>, devLinks: Array<{ kind: DevLinkKind, url: string, title: string, ref: string, state: DevLinkState | null, provider: string, repository: string | null, author: string | null, at: string }>, attachments: Array<{ id: string, fileName: string, mimeType: string, size: number, uploadedAt: string, commentId: string | null, uploadedBy: { id: string, name: string } }>, assignee: { id: string, name: string } | null, release: { id: string, name: string } | null, sprint: { id: string, name: string } | null, parent: { id: string, key: string, title: string } | null }; +export type IssueFieldsFragment = { + description: string | null; + figmaUrl: string | null; + createdAt: string; + allowedTransitions: Array; + id: string; + projectId: string; + key: string; + type: string; + area: string | null; + title: string; + status: string; + statusCategory: StatusCategory; + priority: IssuePriority; + labels: Array; + commentCount: number; + updatedAt: string; + version: number; + votes: number; + voted: boolean; + rank: string; + storyPoints: number | null; + startDate: string | null; + dueDate: string | null; + trashedAt: string | null; + reporter: { id: string; name: string }; + links: Array<{ + type: IssueLinkType; + direction: LinkDirection; + issueId: string; + issueKey: string; + }>; + watchers: Array<{ id: string; name: string }>; + checklist: Array<{ id: string; text: string; done: boolean }>; + devLinks: Array<{ + kind: DevLinkKind; + url: string; + title: string; + ref: string; + state: DevLinkState | null; + provider: string; + repository: string | null; + author: string | null; + at: string; + }>; + attachments: Array<{ + id: string; + fileName: string; + mimeType: string; + size: number; + uploadedAt: string; + commentId: string | null; + uploadedBy: { id: string; name: string }; + }>; + assignee: { id: string; name: string } | null; + release: { id: string; name: string } | null; + sprint: { id: string; name: string } | null; + parent: { id: string; key: string; title: string } | null; + blockedBy: Array<{ id: string; key: string; title: string }>; +}; -export type CommentFieldsFragment = { id: string, issueId: string, body: string, replyTo: string | null, deleted: boolean, createdAt: string, editedAt: string | null, author: { id: string, name: string } }; +export type CommentFieldsFragment = { + id: string; + issueId: string; + body: string; + replyTo: string | null; + deleted: boolean; + createdAt: string; + editedAt: string | null; + reactions: Array<{ + emoji: string; + users: Array<{ id: string; name: string }>; + }>; + author: { id: string; name: string }; +}; -export type ReleaseFieldsFragment = { id: string, projectId: string, name: string, description: string | null, targetDate: string | null, status: ReleaseStatus, releasedAt: string | null, notes: string | null }; +export type ReleaseFieldsFragment = { + id: string; + projectId: string; + name: string; + description: string | null; + targetDate: string | null; + status: ReleaseStatus; + releasedAt: string | null; + notes: string | null; +}; -export type ActivityFieldsFragment = { id: string, type: string, issueId: string | null, issueKey: string | null, summary: string, occurredAt: string, actor: { id: string, name: string } }; +export type ActivityFieldsFragment = { + id: string; + type: string; + issueId: string | null; + issueKey: string | null; + summary: string; + occurredAt: string; + actor: { id: string; name: string }; +}; -export type CommandResultFieldsFragment = { id: string, key: string | null, version: number }; +export type CommandResultFieldsFragment = { + id: string; + key: string | null; + version: number; +}; -export type GitRepositoryFieldsFragment = { id: string, name: string, secret: string | null, createdAt: string }; +export type GitRepositoryFieldsFragment = { + id: string; + name: string; + secret: string | null; + createdAt: string; +}; export type GitIntegrationQueryVariables = Exact<{ projectId: string; }>; - -export type GitIntegrationQuery = { gitIntegration: { enabled: boolean, webhookPath: string, repositories: Array<{ id: string, name: string, secret: string | null, createdAt: string }> } }; +export type GitIntegrationQuery = { + gitIntegration: { + enabled: boolean; + webhookPath: string; + repositories: Array<{ + id: string; + name: string; + secret: string | null; + createdAt: string; + }>; + }; +}; export type AddGitRepositoryMutationVariables = Exact<{ projectId: string; name: string; }>; - -export type AddGitRepositoryMutation = { addGitRepository: { id: string, name: string, secret: string | null, createdAt: string } }; +export type AddGitRepositoryMutation = { + addGitRepository: { + id: string; + name: string; + secret: string | null; + createdAt: string; + }; +}; export type RotateGitRepositorySecretMutationVariables = Exact<{ projectId: string; repositoryId: string; }>; - -export type RotateGitRepositorySecretMutation = { rotateGitRepositorySecret: { id: string, name: string, secret: string | null, createdAt: string } }; +export type RotateGitRepositorySecretMutation = { + rotateGitRepositorySecret: { + id: string; + name: string; + secret: string | null; + createdAt: string; + }; +}; export type RemoveGitRepositoryMutationVariables = Exact<{ projectId: string; repositoryId: string; }>; - export type RemoveGitRepositoryMutation = { removeGitRepository: boolean }; export type BoardQueryVariables = Exact<{ @@ -452,94 +676,245 @@ export type BoardQueryVariables = Exact<{ sprintId?: string | null | undefined; }>; - -export type BoardQuery = { project: { id: string, board: Array<{ status: string, total: number, issues: Array<{ id: string, projectId: string, key: string, type: string, area: string | null, title: string, status: string, statusCategory: StatusCategory, priority: IssuePriority, labels: Array, commentCount: number, updatedAt: string, version: number, rank: string, storyPoints: number | null, startDate: string | null, dueDate: string | null, trashedAt: string | null, assignee: { id: string, name: string } | null, release: { id: string, name: string } | null, sprint: { id: string, name: string } | null, parent: { id: string, key: string, title: string } | null }> }> } }; +export type BoardQuery = { + project: { + id: string; + board: Array<{ + status: string; + total: number; + issues: Array<{ + id: string; + projectId: string; + key: string; + type: string; + area: string | null; + title: string; + status: string; + statusCategory: StatusCategory; + priority: IssuePriority; + labels: Array; + commentCount: number; + updatedAt: string; + version: number; + votes: number; + voted: boolean; + rank: string; + storyPoints: number | null; + startDate: string | null; + dueDate: string | null; + trashedAt: string | null; + assignee: { id: string; name: string } | null; + release: { id: string; name: string } | null; + sprint: { id: string; name: string } | null; + parent: { id: string; key: string; title: string } | null; + blockedBy: Array<{ id: string; key: string; title: string }>; + }>; + }>; + }; +}; export type IssueQueryVariables = Exact<{ idOrKey: string; }>; - -export type IssueQuery = { issue: { description: string | null, figmaUrl: string | null, createdAt: string, allowedTransitions: Array, id: string, projectId: string, key: string, type: string, area: string | null, title: string, status: string, statusCategory: StatusCategory, priority: IssuePriority, labels: Array, commentCount: number, updatedAt: string, version: number, rank: string, storyPoints: number | null, startDate: string | null, dueDate: string | null, trashedAt: string | null, reporter: { id: string, name: string }, links: Array<{ type: IssueLinkType, direction: LinkDirection, issueId: string, issueKey: string }>, watchers: Array<{ id: string, name: string }>, checklist: Array<{ id: string, text: string, done: boolean }>, devLinks: Array<{ kind: DevLinkKind, url: string, title: string, ref: string, state: DevLinkState | null, provider: string, repository: string | null, author: string | null, at: string }>, attachments: Array<{ id: string, fileName: string, mimeType: string, size: number, uploadedAt: string, commentId: string | null, uploadedBy: { id: string, name: string } }>, assignee: { id: string, name: string } | null, release: { id: string, name: string } | null, sprint: { id: string, name: string } | null, parent: { id: string, key: string, title: string } | null } }; +export type IssueQuery = { + issue: { + description: string | null; + figmaUrl: string | null; + createdAt: string; + allowedTransitions: Array; + id: string; + projectId: string; + key: string; + type: string; + area: string | null; + title: string; + status: string; + statusCategory: StatusCategory; + priority: IssuePriority; + labels: Array; + commentCount: number; + updatedAt: string; + version: number; + votes: number; + voted: boolean; + rank: string; + storyPoints: number | null; + startDate: string | null; + dueDate: string | null; + trashedAt: string | null; + reporter: { id: string; name: string }; + links: Array<{ + type: IssueLinkType; + direction: LinkDirection; + issueId: string; + issueKey: string; + }>; + watchers: Array<{ id: string; name: string }>; + checklist: Array<{ id: string; text: string; done: boolean }>; + devLinks: Array<{ + kind: DevLinkKind; + url: string; + title: string; + ref: string; + state: DevLinkState | null; + provider: string; + repository: string | null; + author: string | null; + at: string; + }>; + attachments: Array<{ + id: string; + fileName: string; + mimeType: string; + size: number; + uploadedAt: string; + commentId: string | null; + uploadedBy: { id: string; name: string }; + }>; + assignee: { id: string; name: string } | null; + release: { id: string; name: string } | null; + sprint: { id: string; name: string } | null; + parent: { id: string; key: string; title: string } | null; + blockedBy: Array<{ id: string; key: string; title: string }>; + }; +}; export type SearchIssuesQueryVariables = Exact<{ filter: IssueFilterInput; }>; - -export type SearchIssuesQuery = { issues: { items: Array<{ id: string, projectId: string, key: string, type: string, area: string | null, title: string, status: string, statusCategory: StatusCategory, priority: IssuePriority, labels: Array, commentCount: number, updatedAt: string, version: number, rank: string, storyPoints: number | null, startDate: string | null, dueDate: string | null, trashedAt: string | null, assignee: { id: string, name: string } | null, release: { id: string, name: string } | null, sprint: { id: string, name: string } | null, parent: { id: string, key: string, title: string } | null }> } }; +export type SearchIssuesQuery = { + issues: { + items: Array<{ + id: string; + projectId: string; + key: string; + type: string; + area: string | null; + title: string; + status: string; + statusCategory: StatusCategory; + priority: IssuePriority; + labels: Array; + commentCount: number; + updatedAt: string; + version: number; + votes: number; + voted: boolean; + rank: string; + storyPoints: number | null; + startDate: string | null; + dueDate: string | null; + trashedAt: string | null; + assignee: { id: string; name: string } | null; + release: { id: string; name: string } | null; + sprint: { id: string; name: string } | null; + parent: { id: string; key: string; title: string } | null; + blockedBy: Array<{ id: string; key: string; title: string }>; + }>; + }; +}; export type CreateIssueMutationVariables = Exact<{ input: CreateIssueInput; }>; - -export type CreateIssueMutation = { createIssue: { id: string, key: string | null, version: number } }; +export type CreateIssueMutation = { + createIssue: { id: string; key: string | null; version: number }; +}; export type UpdateIssueMutationVariables = Exact<{ input: UpdateIssueInput; }>; - -export type UpdateIssueMutation = { updateIssue: { id: string, key: string | null, version: number } }; +export type UpdateIssueMutation = { + updateIssue: { id: string; key: string | null; version: number }; +}; export type ChangeIssueStatusMutationVariables = Exact<{ input: ChangeIssueStatusInput; }>; - -export type ChangeIssueStatusMutation = { changeIssueStatus: { id: string, key: string | null, version: number } }; +export type ChangeIssueStatusMutation = { + changeIssueStatus: { id: string; key: string | null; version: number }; +}; export type AssignIssueMutationVariables = Exact<{ issueId: string; assigneeId?: string | null | undefined; }>; - -export type AssignIssueMutation = { assignIssue: { id: string, key: string | null, version: number } }; +export type AssignIssueMutation = { + assignIssue: { id: string; key: string | null; version: number }; +}; export type LinkIssuesMutationVariables = Exact<{ input: LinkIssuesInput; }>; - -export type LinkIssuesMutation = { linkIssues: { id: string, key: string | null, version: number } }; +export type LinkIssuesMutation = { + linkIssues: { id: string; key: string | null; version: number }; +}; export type UnlinkIssuesMutationVariables = Exact<{ input: LinkIssuesInput; }>; - -export type UnlinkIssuesMutation = { unlinkIssues: { id: string, key: string | null, version: number } }; +export type UnlinkIssuesMutation = { + unlinkIssues: { id: string; key: string | null; version: number }; +}; export type WatchIssueMutationVariables = Exact<{ issueId: string; }>; - -export type WatchIssueMutation = { watchIssue: { id: string, key: string | null, version: number } }; +export type WatchIssueMutation = { + watchIssue: { id: string; key: string | null; version: number }; +}; export type UnwatchIssueMutationVariables = Exact<{ issueId: string; }>; - -export type UnwatchIssueMutation = { unwatchIssue: { id: string, key: string | null, version: number } }; +export type UnwatchIssueMutation = { + unwatchIssue: { id: string; key: string | null; version: number }; +}; export type SetIssueReleaseMutationVariables = Exact<{ issueId: string; releaseId?: string | null | undefined; }>; - -export type SetIssueReleaseMutation = { setIssueRelease: { id: string, key: string | null, version: number } }; +export type SetIssueReleaseMutation = { + setIssueRelease: { id: string; key: string | null; version: number }; +}; export type IssueCommentsQueryVariables = Exact<{ idOrKey: string; }>; - -export type IssueCommentsQuery = { issue: { id: string, comments: { items: Array<{ id: string, issueId: string, body: string, replyTo: string | null, deleted: boolean, createdAt: string, editedAt: string | null, author: { id: string, name: string } }> } } }; +export type IssueCommentsQuery = { + issue: { + id: string; + comments: { + items: Array<{ + id: string; + issueId: string; + body: string; + replyTo: string | null; + deleted: boolean; + createdAt: string; + editedAt: string | null; + reactions: Array<{ + emoji: string; + users: Array<{ id: string; name: string }>; + }>; + author: { id: string; name: string }; + }>; + }; + }; +}; export type AddCommentMutationVariables = Exact<{ issueId: string; @@ -547,23 +922,26 @@ export type AddCommentMutationVariables = Exact<{ replyTo?: string | null | undefined; }>; - -export type AddCommentMutation = { addComment: { id: string, key: string | null, version: number } }; +export type AddCommentMutation = { + addComment: { id: string; key: string | null; version: number }; +}; export type EditCommentMutationVariables = Exact<{ commentId: string; body: string; }>; - -export type EditCommentMutation = { editComment: { id: string, key: string | null, version: number } }; +export type EditCommentMutation = { + editComment: { id: string; key: string | null; version: number }; +}; export type DeleteCommentMutationVariables = Exact<{ commentId: string; }>; - -export type DeleteCommentMutation = { deleteComment: { id: string, key: string | null, version: number } }; +export type DeleteCommentMutation = { + deleteComment: { id: string; key: string | null; version: number }; +}; export type MyIssuesQueryVariables = Exact<{ assignedToMe: boolean; @@ -573,436 +951,1219 @@ export type MyIssuesQueryVariables = Exact<{ search?: string | null | undefined; }>; - -export type MyIssuesQuery = { myIssues: { total: number, items: Array<{ id: string, projectId: string, key: string, type: string, area: string | null, title: string, status: string, statusCategory: StatusCategory, priority: IssuePriority, labels: Array, commentCount: number, updatedAt: string, version: number, rank: string, storyPoints: number | null, startDate: string | null, dueDate: string | null, trashedAt: string | null, assignee: { id: string, name: string } | null, release: { id: string, name: string } | null, sprint: { id: string, name: string } | null, parent: { id: string, key: string, title: string } | null }> } }; +export type MyIssuesQuery = { + myIssues: { + total: number; + items: Array<{ + id: string; + projectId: string; + key: string; + type: string; + area: string | null; + title: string; + status: string; + statusCategory: StatusCategory; + priority: IssuePriority; + labels: Array; + commentCount: number; + updatedAt: string; + version: number; + votes: number; + voted: boolean; + rank: string; + storyPoints: number | null; + startDate: string | null; + dueDate: string | null; + trashedAt: string | null; + assignee: { id: string; name: string } | null; + release: { id: string; name: string } | null; + sprint: { id: string; name: string } | null; + parent: { id: string; key: string; title: string } | null; + blockedBy: Array<{ id: string; key: string; title: string }>; + }>; + }; +}; export type IssueChildrenQueryVariables = Exact<{ filter: IssueFilterInput; }>; - -export type IssueChildrenQuery = { issues: { items: Array<{ id: string, projectId: string, key: string, type: string, area: string | null, title: string, status: string, statusCategory: StatusCategory, priority: IssuePriority, labels: Array, commentCount: number, updatedAt: string, version: number, rank: string, storyPoints: number | null, startDate: string | null, dueDate: string | null, trashedAt: string | null, assignee: { id: string, name: string } | null, release: { id: string, name: string } | null, sprint: { id: string, name: string } | null, parent: { id: string, key: string, title: string } | null }> } }; +export type IssueChildrenQuery = { + issues: { + items: Array<{ + id: string; + projectId: string; + key: string; + type: string; + area: string | null; + title: string; + status: string; + statusCategory: StatusCategory; + priority: IssuePriority; + labels: Array; + commentCount: number; + updatedAt: string; + version: number; + votes: number; + voted: boolean; + rank: string; + storyPoints: number | null; + startDate: string | null; + dueDate: string | null; + trashedAt: string | null; + assignee: { id: string; name: string } | null; + release: { id: string; name: string } | null; + sprint: { id: string; name: string } | null; + parent: { id: string; key: string; title: string } | null; + blockedBy: Array<{ id: string; key: string; title: string }>; + }>; + }; +}; export type EpicsQueryVariables = Exact<{ projectId: string; }>; - -export type EpicsQuery = { epics: Array<{ issue: { id: string, projectId: string, key: string, type: string, area: string | null, title: string, status: string, statusCategory: StatusCategory, priority: IssuePriority, labels: Array, commentCount: number, updatedAt: string, version: number, rank: string, storyPoints: number | null, startDate: string | null, dueDate: string | null, trashedAt: string | null, assignee: { id: string, name: string } | null, release: { id: string, name: string } | null, sprint: { id: string, name: string } | null, parent: { id: string, key: string, title: string } | null }, progress: { total: number, finished: number, percent: number, storyPoints: number, finishedStoryPoints: number } }> }; +export type EpicsQuery = { + epics: Array<{ + issue: { + id: string; + projectId: string; + key: string; + type: string; + area: string | null; + title: string; + status: string; + statusCategory: StatusCategory; + priority: IssuePriority; + labels: Array; + commentCount: number; + updatedAt: string; + version: number; + votes: number; + voted: boolean; + rank: string; + storyPoints: number | null; + startDate: string | null; + dueDate: string | null; + trashedAt: string | null; + assignee: { id: string; name: string } | null; + release: { id: string; name: string } | null; + sprint: { id: string; name: string } | null; + parent: { id: string; key: string; title: string } | null; + blockedBy: Array<{ id: string; key: string; title: string }>; + }; + progress: { + total: number; + finished: number; + percent: number; + storyPoints: number; + finishedStoryPoints: number; + }; + }>; +}; export type SetIssueParentMutationVariables = Exact<{ issueId: string; parentId?: string | null | undefined; }>; - -export type SetIssueParentMutation = { setIssueParent: { id: string, key: string | null, version: number } }; +export type SetIssueParentMutation = { + setIssueParent: { id: string; key: string | null; version: number }; +}; export type AddChecklistItemMutationVariables = Exact<{ input: AddChecklistItemInput; }>; - -export type AddChecklistItemMutation = { addChecklistItem: { id: string, key: string | null, version: number } }; +export type AddChecklistItemMutation = { + addChecklistItem: { id: string; key: string | null; version: number }; +}; export type UpdateChecklistItemMutationVariables = Exact<{ input: UpdateChecklistItemInput; }>; - -export type UpdateChecklistItemMutation = { updateChecklistItem: { id: string, key: string | null, version: number } }; +export type UpdateChecklistItemMutation = { + updateChecklistItem: { id: string; key: string | null; version: number }; +}; export type RemoveChecklistItemMutationVariables = Exact<{ issueId: string; itemId: string; }>; - -export type RemoveChecklistItemMutation = { removeChecklistItem: { id: string, key: string | null, version: number } }; +export type RemoveChecklistItemMutation = { + removeChecklistItem: { id: string; key: string | null; version: number }; +}; export type BacklogQueryVariables = Exact<{ filter: IssueFilterInput; }>; - -export type BacklogQuery = { issues: { total: number, items: Array<{ id: string, projectId: string, key: string, type: string, area: string | null, title: string, status: string, statusCategory: StatusCategory, priority: IssuePriority, labels: Array, commentCount: number, updatedAt: string, version: number, rank: string, storyPoints: number | null, startDate: string | null, dueDate: string | null, trashedAt: string | null, assignee: { id: string, name: string } | null, release: { id: string, name: string } | null, sprint: { id: string, name: string } | null, parent: { id: string, key: string, title: string } | null }> } }; +export type BacklogQuery = { + issues: { + total: number; + items: Array<{ + id: string; + projectId: string; + key: string; + type: string; + area: string | null; + title: string; + status: string; + statusCategory: StatusCategory; + priority: IssuePriority; + labels: Array; + commentCount: number; + updatedAt: string; + version: number; + votes: number; + voted: boolean; + rank: string; + storyPoints: number | null; + startDate: string | null; + dueDate: string | null; + trashedAt: string | null; + assignee: { id: string; name: string } | null; + release: { id: string; name: string } | null; + sprint: { id: string; name: string } | null; + parent: { id: string; key: string; title: string } | null; + blockedBy: Array<{ id: string; key: string; title: string }>; + }>; + }; +}; export type RankIssueMutationVariables = Exact<{ input: RankIssueInput; }>; - -export type RankIssueMutation = { rankIssue: { id: string, key: string | null, version: number } }; +export type RankIssueMutation = { + rankIssue: { id: string; key: string | null; version: number }; +}; export type BulkUpdateIssuesMutationVariables = Exact<{ input: BulkUpdateIssuesInput; }>; - -export type BulkUpdateIssuesMutation = { bulkUpdateIssues: { updated: number, results: Array<{ issueId: string, ok: boolean, error: string | null }> } }; +export type BulkUpdateIssuesMutation = { + bulkUpdateIssues: { + updated: number; + results: Array<{ issueId: string; ok: boolean; error: string | null }>; + }; +}; export type TrashIssueMutationVariables = Exact<{ issueId: string; }>; - -export type TrashIssueMutation = { trashIssue: { id: string, key: string | null, version: number } }; +export type TrashIssueMutation = { + trashIssue: { id: string; key: string | null; version: number }; +}; export type RestoreIssueMutationVariables = Exact<{ issueId: string; }>; - -export type RestoreIssueMutation = { restoreIssue: { id: string, key: string | null, version: number } }; +export type RestoreIssueMutation = { + restoreIssue: { id: string; key: string | null; version: number }; +}; export type TrashQueryVariables = Exact<{ projectId: string; }>; - -export type TrashQuery = { trash: Array<{ id: string, projectId: string, key: string, type: string, area: string | null, title: string, status: string, statusCategory: StatusCategory, priority: IssuePriority, labels: Array, commentCount: number, updatedAt: string, version: number, rank: string, storyPoints: number | null, startDate: string | null, dueDate: string | null, trashedAt: string | null, assignee: { id: string, name: string } | null, release: { id: string, name: string } | null, sprint: { id: string, name: string } | null, parent: { id: string, key: string, title: string } | null }> }; +export type TrashQuery = { + trash: Array<{ + id: string; + projectId: string; + key: string; + type: string; + area: string | null; + title: string; + status: string; + statusCategory: StatusCategory; + priority: IssuePriority; + labels: Array; + commentCount: number; + updatedAt: string; + version: number; + votes: number; + voted: boolean; + rank: string; + storyPoints: number | null; + startDate: string | null; + dueDate: string | null; + trashedAt: string | null; + assignee: { id: string; name: string } | null; + release: { id: string; name: string } | null; + sprint: { id: string; name: string } | null; + parent: { id: string; key: string; title: string } | null; + blockedBy: Array<{ id: string; key: string; title: string }>; + }>; +}; export type DueIssuesQueryVariables = Exact<{ filter: IssueFilterInput; }>; +export type DueIssuesQuery = { + issues: { + items: Array<{ + id: string; + projectId: string; + key: string; + type: string; + area: string | null; + title: string; + status: string; + statusCategory: StatusCategory; + priority: IssuePriority; + labels: Array; + commentCount: number; + updatedAt: string; + version: number; + votes: number; + voted: boolean; + rank: string; + storyPoints: number | null; + startDate: string | null; + dueDate: string | null; + trashedAt: string | null; + assignee: { id: string; name: string } | null; + release: { id: string; name: string } | null; + sprint: { id: string; name: string } | null; + parent: { id: string; key: string; title: string } | null; + blockedBy: Array<{ id: string; key: string; title: string }>; + }>; + }; +}; -export type DueIssuesQuery = { issues: { items: Array<{ id: string, projectId: string, key: string, type: string, area: string | null, title: string, status: string, statusCategory: StatusCategory, priority: IssuePriority, labels: Array, commentCount: number, updatedAt: string, version: number, rank: string, storyPoints: number | null, startDate: string | null, dueDate: string | null, trashedAt: string | null, assignee: { id: string, name: string } | null, release: { id: string, name: string } | null, sprint: { id: string, name: string } | null, parent: { id: string, key: string, title: string } | null }> } }; +export type IssueListQueryVariables = Exact<{ + filter: IssueFilterInput; + limit: number; +}>; -export type NotificationFieldsFragment = { id: string, kind: NotificationKind, projectId: string, projectKey: string, issueId: string | null, issueKey: string | null, summary: string, readAt: string | null, createdAt: string, actor: { id: string, name: string } }; +export type IssueListQuery = { + issues: { + total: number; + items: Array<{ + id: string; + projectId: string; + key: string; + type: string; + area: string | null; + title: string; + status: string; + statusCategory: StatusCategory; + priority: IssuePriority; + labels: Array; + commentCount: number; + updatedAt: string; + version: number; + votes: number; + voted: boolean; + rank: string; + storyPoints: number | null; + startDate: string | null; + dueDate: string | null; + trashedAt: string | null; + assignee: { id: string; name: string } | null; + release: { id: string; name: string } | null; + sprint: { id: string; name: string } | null; + parent: { id: string; key: string; title: string } | null; + blockedBy: Array<{ id: string; key: string; title: string }>; + }>; + }; +}; + +export type ReactToCommentMutationVariables = Exact<{ + commentId: string; + emoji: string; + on: boolean; +}>; + +export type ReactToCommentMutation = { + reactToComment: { id: string; key: string | null; version: number }; +}; + +export type DuplicateIssueMutationVariables = Exact<{ + issueId: string; +}>; + +export type DuplicateIssueMutation = { + duplicateIssue: { id: string; key: string | null; version: number }; +}; + +export type VoteIssueMutationVariables = Exact<{ + issueId: string; + on: boolean; +}>; + +export type VoteIssueMutation = { + voteIssue: { id: string; key: string | null; version: number }; +}; + +export type NotificationFieldsFragment = { + id: string; + kind: NotificationKind; + projectId: string; + projectKey: string; + issueId: string | null; + issueKey: string | null; + summary: string; + readAt: string | null; + createdAt: string; + actor: { id: string; name: string }; +}; export type MyNotificationsQueryVariables = Exact<{ unreadOnly: boolean; limit: number; }>; +export type MyNotificationsQuery = { + myNotifications: { + unread: number; + items: Array<{ + id: string; + kind: NotificationKind; + projectId: string; + projectKey: string; + issueId: string | null; + issueKey: string | null; + summary: string; + readAt: string | null; + createdAt: string; + actor: { id: string; name: string }; + }>; + }; +}; -export type MyNotificationsQuery = { myNotifications: { unread: number, items: Array<{ id: string, kind: NotificationKind, projectId: string, projectKey: string, issueId: string | null, issueKey: string | null, summary: string, readAt: string | null, createdAt: string, actor: { id: string, name: string } }> } }; +export type NotificationSettingsQueryVariables = Exact<{ + [key: string]: never; +}>; -export type NotificationSettingsQueryVariables = Exact<{ [key: string]: never; }>; - - -export type NotificationSettingsQuery = { notificationSettings: { email: boolean, emailAvailable: boolean } }; +export type NotificationSettingsQuery = { + notificationSettings: { email: boolean; emailAvailable: boolean }; +}; export type MarkNotificationsReadMutationVariables = Exact<{ ids?: Array | string | null | undefined; }>; - export type MarkNotificationsReadMutation = { markNotificationsRead: boolean }; export type UpdateNotificationSettingsMutationVariables = Exact<{ email: boolean; }>; +export type UpdateNotificationSettingsMutation = { + updateNotificationSettings: { email: boolean; emailAvailable: boolean }; +}; -export type UpdateNotificationSettingsMutation = { updateNotificationSettings: { email: boolean, emailAvailable: boolean } }; +export type NotificationAddedSubscriptionVariables = Exact<{ + [key: string]: never; +}>; -export type NotificationAddedSubscriptionVariables = Exact<{ [key: string]: never; }>; +export type NotificationAddedSubscription = { + notificationAdded: { + id: string; + kind: NotificationKind; + projectId: string; + projectKey: string; + issueId: string | null; + issueKey: string | null; + summary: string; + readAt: string | null; + createdAt: string; + actor: { id: string; name: string }; + }; +}; +export type MyProjectsQueryVariables = Exact<{ [key: string]: never }>; -export type NotificationAddedSubscription = { notificationAdded: { id: string, kind: NotificationKind, projectId: string, projectKey: string, issueId: string | null, issueKey: string | null, summary: string, readAt: string | null, createdAt: string, actor: { id: string, name: string } } }; - -export type MyProjectsQueryVariables = Exact<{ [key: string]: never; }>; - - -export type MyProjectsQuery = { myProjects: Array<{ id: string, key: string, name: string, description: string | null, isPublic: boolean, updatedAt: string, version: number, owner: { id: string, name: string }, members: Array<{ role: ProjectRole, user: { id: string, name: string } }>, settings: { statuses: Array<{ id: string, name: string, category: StatusCategory, color: string, requiresReason: boolean, archived: boolean, wipLimit: number | null }>, transitions: Array<{ from: string, to: Array }>, issueTypes: Array<{ id: string, name: string, icon: string, color: string, archived: boolean, template: { description: string | null, checklist: Array } | null }>, areas: Array<{ id: string, name: string, archived: boolean }> } }> }; +export type MyProjectsQuery = { + myProjects: Array<{ + id: string; + key: string; + name: string; + description: string | null; + isPublic: boolean; + acceptsProposals: boolean; + updatedAt: string; + version: number; + owner: { id: string; name: string }; + members: Array<{ role: ProjectRole; user: { id: string; name: string } }>; + settings: { + statuses: Array<{ + id: string; + name: string; + category: StatusCategory; + color: string; + requiresReason: boolean; + archived: boolean; + wipLimit: number | null; + }>; + transitions: Array<{ from: string; to: Array }>; + issueTypes: Array<{ + id: string; + name: string; + icon: string; + color: string; + archived: boolean; + template: { + description: string | null; + checklist: Array; + } | null; + }>; + areas: Array<{ id: string; name: string; archived: boolean }>; + }; + }>; +}; export type ProjectQueryVariables = Exact<{ idOrKey: string; }>; - -export type ProjectQuery = { project: { id: string, key: string, name: string, description: string | null, isPublic: boolean, updatedAt: string, version: number, owner: { id: string, name: string }, members: Array<{ role: ProjectRole, user: { id: string, name: string } }>, settings: { statuses: Array<{ id: string, name: string, category: StatusCategory, color: string, requiresReason: boolean, archived: boolean, wipLimit: number | null }>, transitions: Array<{ from: string, to: Array }>, issueTypes: Array<{ id: string, name: string, icon: string, color: string, archived: boolean, template: { description: string | null, checklist: Array } | null }>, areas: Array<{ id: string, name: string, archived: boolean }> } } }; +export type ProjectQuery = { + project: { + id: string; + key: string; + name: string; + description: string | null; + isPublic: boolean; + acceptsProposals: boolean; + updatedAt: string; + version: number; + owner: { id: string; name: string }; + members: Array<{ role: ProjectRole; user: { id: string; name: string } }>; + settings: { + statuses: Array<{ + id: string; + name: string; + category: StatusCategory; + color: string; + requiresReason: boolean; + archived: boolean; + wipLimit: number | null; + }>; + transitions: Array<{ from: string; to: Array }>; + issueTypes: Array<{ + id: string; + name: string; + icon: string; + color: string; + archived: boolean; + template: { + description: string | null; + checklist: Array; + } | null; + }>; + areas: Array<{ id: string; name: string; archived: boolean }>; + }; + }; +}; export type ProjectStatsQueryVariables = Exact<{ idOrKey: string; }>; - -export type ProjectStatsQuery = { project: { id: string, stats: { total: number, open: number, byStatus: Array<{ key: string, count: number }>, byType: Array<{ key: string, count: number }>, byPriority: Array<{ key: string, count: number }>, byArea: Array<{ key: string, count: number }>, byAssignee: Array<{ count: number, user: { id: string, name: string } | null }> } } }; +export type ProjectStatsQuery = { + project: { + id: string; + stats: { + total: number; + open: number; + byStatus: Array<{ key: string; count: number }>; + byType: Array<{ key: string; count: number }>; + byPriority: Array<{ key: string; count: number }>; + byArea: Array<{ key: string; count: number }>; + byAssignee: Array<{ + count: number; + user: { id: string; name: string } | null; + }>; + }; + }; +}; export type CreateProjectMutationVariables = Exact<{ input: CreateProjectInput; }>; - -export type CreateProjectMutation = { createProject: { id: string, key: string | null, version: number } }; +export type CreateProjectMutation = { + createProject: { id: string; key: string | null; version: number }; +}; export type AddProjectMemberMutationVariables = Exact<{ input: ProjectMemberInput; }>; - -export type AddProjectMemberMutation = { addProjectMember: { id: string, key: string | null, version: number } }; +export type AddProjectMemberMutation = { + addProjectMember: { id: string; key: string | null; version: number }; +}; export type ChangeProjectMemberRoleMutationVariables = Exact<{ input: ProjectMemberInput; }>; - -export type ChangeProjectMemberRoleMutation = { changeProjectMemberRole: { id: string, key: string | null, version: number } }; +export type ChangeProjectMemberRoleMutation = { + changeProjectMemberRole: { id: string; key: string | null; version: number }; +}; export type RemoveProjectMemberMutationVariables = Exact<{ projectId: string; userId: string; }>; - -export type RemoveProjectMemberMutation = { removeProjectMember: { id: string, key: string | null, version: number } }; +export type RemoveProjectMemberMutation = { + removeProjectMember: { id: string; key: string | null; version: number }; +}; export type SearchUsersQueryVariables = Exact<{ search: string; }>; - -export type SearchUsersQuery = { users: Array<{ id: string, name: string, email: string }> }; +export type SearchUsersQuery = { + users: Array<{ id: string; name: string; email: string }>; +}; export type UpdateProjectSettingsMutationVariables = Exact<{ projectId: string; settings: ProjectSettingsInput; }>; - -export type UpdateProjectSettingsMutation = { updateProjectSettings: { id: string, key: string | null, version: number } }; +export type UpdateProjectSettingsMutation = { + updateProjectSettings: { id: string; key: string | null; version: number }; +}; export type ProjectAnalyticsQueryVariables = Exact<{ idOrKey: string; days: number; }>; +export type ProjectAnalyticsQuery = { + project: { + id: string; + analytics: { + from: string; + to: string; + createdVsResolved: Array<{ + week: string; + created: number; + resolved: number; + }>; + cumulativeFlow: { + dates: Array; + series: Array<{ status: string; counts: Array }>; + }; + cycleTime: { + count: number; + averageDays: number | null; + p85Days: number | null; + }; + leadTime: { + count: number; + averageDays: number | null; + p85Days: number | null; + }; + throughput: Array<{ + week: string; + count: number; + user: { id: string; name: string } | null; + }>; + qa: { passed: number; failed: number; failureRate: number | null }; + }; + }; +}; -export type ProjectAnalyticsQuery = { project: { id: string, analytics: { from: string, to: string, createdVsResolved: Array<{ week: string, created: number, resolved: number }>, cumulativeFlow: { dates: Array, series: Array<{ status: string, counts: Array }> }, cycleTime: { count: number, averageDays: number | null, p85Days: number | null }, leadTime: { count: number, averageDays: number | null, p85Days: number | null }, throughput: Array<{ week: string, count: number, user: { id: string, name: string } | null }>, qa: { passed: number, failed: number, failureRate: number | null } } } }; +export type PublicProjectsQueryVariables = Exact<{ [key: string]: never }>; -export type PublicProjectsQueryVariables = Exact<{ [key: string]: never; }>; - - -export type PublicProjectsQuery = { publicProjects: Array<{ id: string, key: string, name: string, description: string | null, isPublic: boolean, updatedAt: string, version: number, owner: { id: string, name: string }, members: Array<{ role: ProjectRole, user: { id: string, name: string } }>, settings: { statuses: Array<{ id: string, name: string, category: StatusCategory, color: string, requiresReason: boolean, archived: boolean, wipLimit: number | null }>, transitions: Array<{ from: string, to: Array }>, issueTypes: Array<{ id: string, name: string, icon: string, color: string, archived: boolean, template: { description: string | null, checklist: Array } | null }>, areas: Array<{ id: string, name: string, archived: boolean }> } }> }; +export type PublicProjectsQuery = { + publicProjects: Array<{ + id: string; + key: string; + name: string; + description: string | null; + isPublic: boolean; + acceptsProposals: boolean; + updatedAt: string; + version: number; + owner: { id: string; name: string }; + members: Array<{ role: ProjectRole; user: { id: string; name: string } }>; + settings: { + statuses: Array<{ + id: string; + name: string; + category: StatusCategory; + color: string; + requiresReason: boolean; + archived: boolean; + wipLimit: number | null; + }>; + transitions: Array<{ from: string; to: Array }>; + issueTypes: Array<{ + id: string; + name: string; + icon: string; + color: string; + archived: boolean; + template: { + description: string | null; + checklist: Array; + } | null; + }>; + areas: Array<{ id: string; name: string; archived: boolean }>; + }; + }>; +}; export type UpdateProjectMutationVariables = Exact<{ input: UpdateProjectInput; }>; - -export type UpdateProjectMutation = { updateProject: { id: string, key: string | null, version: number } }; +export type UpdateProjectMutation = { + updateProject: { id: string; key: string | null; version: number }; +}; export type DeleteProjectMutationVariables = Exact<{ projectId: string; confirmKey: string; }>; - -export type DeleteProjectMutation = { deleteProject: { id: string, key: string | null, version: number } }; +export type DeleteProjectMutation = { + deleteProject: { id: string; key: string | null; version: number }; +}; export type ReleasesQueryVariables = Exact<{ idOrKey: string; }>; - -export type ReleasesQuery = { project: { id: string, releases: Array<{ id: string, projectId: string, name: string, description: string | null, targetDate: string | null, status: ReleaseStatus, releasedAt: string | null, notes: string | null, progress: { total: number, finished: number, percent: number } }> } }; +export type ReleasesQuery = { + project: { + id: string; + releases: Array<{ + id: string; + projectId: string; + name: string; + description: string | null; + targetDate: string | null; + status: ReleaseStatus; + releasedAt: string | null; + notes: string | null; + progress: { total: number; finished: number; percent: number }; + }>; + }; +}; export type CreateReleaseMutationVariables = Exact<{ input: CreateReleaseInput; }>; - -export type CreateReleaseMutation = { createRelease: { id: string, key: string | null, version: number } }; +export type CreateReleaseMutation = { + createRelease: { id: string; key: string | null; version: number }; +}; export type PublishReleaseMutationVariables = Exact<{ releaseId: string; force: boolean; }>; - -export type PublishReleaseMutation = { publishRelease: { id: string, key: string | null, version: number } }; +export type PublishReleaseMutation = { + publishRelease: { id: string; key: string | null; version: number }; +}; export type ArchiveReleaseMutationVariables = Exact<{ releaseId: string; }>; - -export type ArchiveReleaseMutation = { archiveRelease: { id: string, key: string | null, version: number } }; +export type ArchiveReleaseMutation = { + archiveRelease: { id: string; key: string | null; version: number }; +}; export type ActivityQueryVariables = Exact<{ projectId: string; issueId?: string | null | undefined; }>; - -export type ActivityQuery = { activity: Array<{ id: string, type: string, issueId: string | null, issueKey: string | null, summary: string, occurredAt: string, actor: { id: string, name: string } }> }; +export type ActivityQuery = { + activity: Array<{ + id: string; + type: string; + issueId: string | null; + issueKey: string | null; + summary: string; + occurredAt: string; + actor: { id: string; name: string }; + }>; +}; export type UpcomingReleasesQueryVariables = Exact<{ limit: number; }>; - -export type UpcomingReleasesQuery = { upcomingReleases: Array<{ id: string, projectId: string, name: string, description: string | null, targetDate: string | null, status: ReleaseStatus, releasedAt: string | null, notes: string | null, progress: { total: number, finished: number, percent: number } }> }; +export type UpcomingReleasesQuery = { + upcomingReleases: Array<{ + id: string; + projectId: string; + name: string; + description: string | null; + targetDate: string | null; + status: ReleaseStatus; + releasedAt: string | null; + notes: string | null; + progress: { total: number; finished: number; percent: number }; + }>; +}; export type ReleaseBurnupQueryVariables = Exact<{ id: string; }>; - -export type ReleaseBurnupQuery = { release: { id: string, burnup: { releaseId: string, targetDate: string | null, dates: Array, scope: Array, done: Array } } }; +export type ReleaseBurnupQuery = { + release: { + id: string; + burnup: { + releaseId: string; + targetDate: string | null; + dates: Array; + scope: Array; + done: Array; + }; + }; +}; export type ReleaseNotesDraftQueryVariables = Exact<{ id: string; }>; - -export type ReleaseNotesDraftQuery = { release: { id: string, notesDraft: string } }; +export type ReleaseNotesDraftQuery = { + release: { id: string; notesDraft: string }; +}; export type WriteReleaseNotesMutationVariables = Exact<{ releaseId: string; notes?: string | null | undefined; }>; +export type WriteReleaseNotesMutation = { + writeReleaseNotes: { id: string; key: string | null; version: number }; +}; -export type WriteReleaseNotesMutation = { writeReleaseNotes: { id: string, key: string | null, version: number } }; - -export type SavedFilterFieldsFragment = { id: string, projectId: string, name: string, shared: boolean, createdAt: string, owner: { id: string, name: string }, criteria: { types: Array | null, areas: Array | null, priorities: Array | null, assigneeId: string | null, unassigned: boolean | null, releaseId: string | null, labels: Array | null, search: string | null } }; +export type SavedFilterFieldsFragment = { + id: string; + projectId: string; + name: string; + shared: boolean; + createdAt: string; + owner: { id: string; name: string }; + criteria: { + types: Array | null; + areas: Array | null; + priorities: Array | null; + assigneeId: string | null; + unassigned: boolean | null; + releaseId: string | null; + labels: Array | null; + search: string | null; + }; +}; export type SavedFiltersQueryVariables = Exact<{ projectId: string; }>; - -export type SavedFiltersQuery = { savedFilters: Array<{ id: string, projectId: string, name: string, shared: boolean, createdAt: string, owner: { id: string, name: string }, criteria: { types: Array | null, areas: Array | null, priorities: Array | null, assigneeId: string | null, unassigned: boolean | null, releaseId: string | null, labels: Array | null, search: string | null } }> }; +export type SavedFiltersQuery = { + savedFilters: Array<{ + id: string; + projectId: string; + name: string; + shared: boolean; + createdAt: string; + owner: { id: string; name: string }; + criteria: { + types: Array | null; + areas: Array | null; + priorities: Array | null; + assigneeId: string | null; + unassigned: boolean | null; + releaseId: string | null; + labels: Array | null; + search: string | null; + }; + }>; +}; export type SaveFilterMutationVariables = Exact<{ input: SaveFilterInput; }>; - export type SaveFilterMutation = { saveFilter: string }; export type DeleteSavedFilterMutationVariables = Exact<{ id: string; }>; - export type DeleteSavedFilterMutation = { deleteSavedFilter: boolean }; -export type SprintFieldsFragment = { id: string, projectId: string, name: string, goal: string | null, startDate: string, endDate: string, status: SprintStatus, startedAt: string | null, closedAt: string | null, progress: { total: number, finished: number, percent: number, storyPoints: number, finishedStoryPoints: number } }; +export type SprintFieldsFragment = { + id: string; + projectId: string; + name: string; + goal: string | null; + startDate: string; + endDate: string; + status: SprintStatus; + startedAt: string | null; + closedAt: string | null; + progress: { + total: number; + finished: number; + percent: number; + storyPoints: number; + finishedStoryPoints: number; + }; +}; export type SprintsQueryVariables = Exact<{ projectId: string; }>; - -export type SprintsQuery = { sprints: Array<{ id: string, projectId: string, name: string, goal: string | null, startDate: string, endDate: string, status: SprintStatus, startedAt: string | null, closedAt: string | null, progress: { total: number, finished: number, percent: number, storyPoints: number, finishedStoryPoints: number } }> }; +export type SprintsQuery = { + sprints: Array<{ + id: string; + projectId: string; + name: string; + goal: string | null; + startDate: string; + endDate: string; + status: SprintStatus; + startedAt: string | null; + closedAt: string | null; + progress: { + total: number; + finished: number; + percent: number; + storyPoints: number; + finishedStoryPoints: number; + }; + }>; +}; export type SprintBurndownQueryVariables = Exact<{ id: string; }>; - -export type SprintBurndownQuery = { sprint: { id: string, burndown: { sprintId: string, dates: Array, scope: Array, remaining: Array, remainingPoints: Array, ideal: Array } } }; +export type SprintBurndownQuery = { + sprint: { + id: string; + burndown: { + sprintId: string; + dates: Array; + scope: Array; + remaining: Array; + remainingPoints: Array; + ideal: Array; + }; + }; +}; export type CreateSprintMutationVariables = Exact<{ input: CreateSprintInput; }>; - -export type CreateSprintMutation = { createSprint: { id: string, key: string | null, version: number } }; +export type CreateSprintMutation = { + createSprint: { id: string; key: string | null; version: number }; +}; export type UpdateSprintMutationVariables = Exact<{ input: UpdateSprintInput; }>; - -export type UpdateSprintMutation = { updateSprint: { id: string, key: string | null, version: number } }; +export type UpdateSprintMutation = { + updateSprint: { id: string; key: string | null; version: number }; +}; export type StartSprintMutationVariables = Exact<{ sprintId: string; }>; - -export type StartSprintMutation = { startSprint: { id: string, key: string | null, version: number } }; +export type StartSprintMutation = { + startSprint: { id: string; key: string | null; version: number }; +}; export type CloseSprintMutationVariables = Exact<{ sprintId: string; carryOverToSprintId?: string | null | undefined; }>; - -export type CloseSprintMutation = { closeSprint: { id: string, key: string | null, version: number } }; +export type CloseSprintMutation = { + closeSprint: { id: string; key: string | null; version: number }; +}; export type DeleteSprintMutationVariables = Exact<{ sprintId: string; }>; - -export type DeleteSprintMutation = { deleteSprint: { id: string, key: string | null, version: number } }; +export type DeleteSprintMutation = { + deleteSprint: { id: string; key: string | null; version: number }; +}; export type SetIssueSprintMutationVariables = Exact<{ issueId: string; sprintId?: string | null | undefined; }>; - -export type SetIssueSprintMutation = { setIssueSprint: { id: string, key: string | null, version: number } }; +export type SetIssueSprintMutation = { + setIssueSprint: { id: string; key: string | null; version: number }; +}; export type SprintChangedSubscriptionVariables = Exact<{ projectId: string; }>; - -export type SprintChangedSubscription = { sprintChanged: { action: string, sprintId: string } }; +export type SprintChangedSubscription = { + sprintChanged: { action: string; sprintId: string }; +}; export type IssueChangedSubscriptionVariables = Exact<{ projectId: string; }>; - -export type IssueChangedSubscription = { issueChanged: { action: string, version: number, actorId: string, issue: { id: string, projectId: string, key: string, type: string, area: string | null, title: string, status: string, statusCategory: StatusCategory, priority: IssuePriority, labels: Array, commentCount: number, updatedAt: string, version: number, rank: string, storyPoints: number | null, startDate: string | null, dueDate: string | null, trashedAt: string | null, assignee: { id: string, name: string } | null, release: { id: string, name: string } | null, sprint: { id: string, name: string } | null, parent: { id: string, key: string, title: string } | null } } }; +export type IssueChangedSubscription = { + issueChanged: { + action: string; + version: number; + actorId: string; + issue: { + id: string; + projectId: string; + key: string; + type: string; + area: string | null; + title: string; + status: string; + statusCategory: StatusCategory; + priority: IssuePriority; + labels: Array; + commentCount: number; + updatedAt: string; + version: number; + votes: number; + voted: boolean; + rank: string; + storyPoints: number | null; + startDate: string | null; + dueDate: string | null; + trashedAt: string | null; + assignee: { id: string; name: string } | null; + release: { id: string; name: string } | null; + sprint: { id: string; name: string } | null; + parent: { id: string; key: string; title: string } | null; + blockedBy: Array<{ id: string; key: string; title: string }>; + }; + }; +}; export type CommentChangedSubscriptionVariables = Exact<{ issueId: string; }>; - -export type CommentChangedSubscription = { commentChanged: { action: string, commentId: string, comment: { id: string, issueId: string, body: string, replyTo: string | null, deleted: boolean, createdAt: string, editedAt: string | null, author: { id: string, name: string } } | null } }; +export type CommentChangedSubscription = { + commentChanged: { + action: string; + commentId: string; + comment: { + id: string; + issueId: string; + body: string; + replyTo: string | null; + deleted: boolean; + createdAt: string; + editedAt: string | null; + reactions: Array<{ + emoji: string; + users: Array<{ id: string; name: string }>; + }>; + author: { id: string; name: string }; + } | null; + }; +}; export type ActivityAddedSubscriptionVariables = Exact<{ projectId: string; }>; - -export type ActivityAddedSubscription = { activityAdded: { id: string, type: string, issueId: string | null, issueKey: string | null, summary: string, occurredAt: string, actor: { id: string, name: string } } }; +export type ActivityAddedSubscription = { + activityAdded: { + id: string; + type: string; + issueId: string | null; + issueKey: string | null; + summary: string; + occurredAt: string; + actor: { id: string; name: string }; + }; +}; export type ReleaseChangedSubscriptionVariables = Exact<{ projectId: string; }>; - -export type ReleaseChangedSubscription = { releaseChanged: { release: { id: string, projectId: string, name: string, description: string | null, targetDate: string | null, status: ReleaseStatus, releasedAt: string | null, notes: string | null } } }; +export type ReleaseChangedSubscription = { + releaseChanged: { + release: { + id: string; + projectId: string; + name: string; + description: string | null; + targetDate: string | null; + status: ReleaseStatus; + releasedAt: string | null; + notes: string | null; + }; + }; +}; export type ProjectChangedSubscriptionVariables = Exact<{ projectId: string; }>; +export type ProjectChangedSubscription = { + projectChanged: { + action: string; + project: { + id: string; + key: string; + name: string; + description: string | null; + isPublic: boolean; + acceptsProposals: boolean; + updatedAt: string; + version: number; + owner: { id: string; name: string }; + members: Array<{ role: ProjectRole; user: { id: string; name: string } }>; + settings: { + statuses: Array<{ + id: string; + name: string; + category: StatusCategory; + color: string; + requiresReason: boolean; + archived: boolean; + wipLimit: number | null; + }>; + transitions: Array<{ from: string; to: Array }>; + issueTypes: Array<{ + id: string; + name: string; + icon: string; + color: string; + archived: boolean; + template: { + description: string | null; + checklist: Array; + } | null; + }>; + areas: Array<{ id: string; name: string; archived: boolean }>; + }; + }; + }; +}; -export type ProjectChangedSubscription = { projectChanged: { action: string, project: { id: string, key: string, name: string, description: string | null, isPublic: boolean, updatedAt: string, version: number, owner: { id: string, name: string }, members: Array<{ role: ProjectRole, user: { id: string, name: string } }>, settings: { statuses: Array<{ id: string, name: string, category: StatusCategory, color: string, requiresReason: boolean, archived: boolean, wipLimit: number | null }>, transitions: Array<{ from: string, to: Array }>, issueTypes: Array<{ id: string, name: string, icon: string, color: string, archived: boolean, template: { description: string | null, checklist: Array } | null }>, areas: Array<{ id: string, name: string, archived: boolean }> } } } }; +export type MyProjectsChangedSubscriptionVariables = Exact<{ + [key: string]: never; +}>; -export type MyProjectsChangedSubscriptionVariables = Exact<{ [key: string]: never; }>; +export type MyProjectsChangedSubscription = { + myProjectsChanged: { + action: string; + project: { + id: string; + key: string; + name: string; + description: string | null; + isPublic: boolean; + acceptsProposals: boolean; + updatedAt: string; + version: number; + owner: { id: string; name: string }; + members: Array<{ role: ProjectRole; user: { id: string; name: string } }>; + settings: { + statuses: Array<{ + id: string; + name: string; + category: StatusCategory; + color: string; + requiresReason: boolean; + archived: boolean; + wipLimit: number | null; + }>; + transitions: Array<{ from: string; to: Array }>; + issueTypes: Array<{ + id: string; + name: string; + icon: string; + color: string; + archived: boolean; + template: { + description: string | null; + checklist: Array; + } | null; + }>; + areas: Array<{ id: string; name: string; archived: boolean }>; + }; + }; + }; +}; +export type WebhookFieldsFragment = { + id: string; + url: string; + events: Array; + active: boolean; + createdAt: string; + createdBy: { id: string; name: string }; + lastDelivery: { + at: string; + event: string; + status: number | null; + ok: boolean; + error: string | null; + } | null; +}; -export type MyProjectsChangedSubscription = { myProjectsChanged: { action: string, project: { id: string, key: string, name: string, description: string | null, isPublic: boolean, updatedAt: string, version: number, owner: { id: string, name: string }, members: Array<{ role: ProjectRole, user: { id: string, name: string } }>, settings: { statuses: Array<{ id: string, name: string, category: StatusCategory, color: string, requiresReason: boolean, archived: boolean, wipLimit: number | null }>, transitions: Array<{ from: string, to: Array }>, issueTypes: Array<{ id: string, name: string, icon: string, color: string, archived: boolean, template: { description: string | null, checklist: Array } | null }>, areas: Array<{ id: string, name: string, archived: boolean }> } } } }; - -export type WebhookFieldsFragment = { id: string, url: string, events: Array, active: boolean, createdAt: string, createdBy: { id: string, name: string }, lastDelivery: { at: string, event: string, status: number | null, ok: boolean, error: string | null } | null }; - -export type WebhookDeliveryFieldsFragment = { at: string, event: string, status: number | null, ok: boolean, error: string | null }; +export type WebhookDeliveryFieldsFragment = { + at: string; + event: string; + status: number | null; + ok: boolean; + error: string | null; +}; export type WebhooksQueryVariables = Exact<{ projectId: string; }>; +export type WebhooksQuery = { + webhooks: Array<{ + id: string; + url: string; + events: Array; + active: boolean; + createdAt: string; + createdBy: { id: string; name: string }; + lastDelivery: { + at: string; + event: string; + status: number | null; + ok: boolean; + error: string | null; + } | null; + }>; +}; -export type WebhooksQuery = { webhooks: Array<{ id: string, url: string, events: Array, active: boolean, createdAt: string, createdBy: { id: string, name: string }, lastDelivery: { at: string, event: string, status: number | null, ok: boolean, error: string | null } | null }> }; - -export type WebhookEventsQueryVariables = Exact<{ [key: string]: never; }>; - +export type WebhookEventsQueryVariables = Exact<{ [key: string]: never }>; export type WebhookEventsQuery = { webhookEvents: Array }; @@ -1010,131 +2171,11030 @@ export type CreateWebhookMutationVariables = Exact<{ input: CreateWebhookInput; }>; - -export type CreateWebhookMutation = { createWebhook: { id: string, secret: string } }; +export type CreateWebhookMutation = { + createWebhook: { id: string; secret: string }; +}; export type UpdateWebhookMutationVariables = Exact<{ input: UpdateWebhookInput; }>; - -export type UpdateWebhookMutation = { updateWebhook: { id: string, url: string, events: Array, active: boolean, createdAt: string, createdBy: { id: string, name: string }, lastDelivery: { at: string, event: string, status: number | null, ok: boolean, error: string | null } | null } }; +export type UpdateWebhookMutation = { + updateWebhook: { + id: string; + url: string; + events: Array; + active: boolean; + createdAt: string; + createdBy: { id: string; name: string }; + lastDelivery: { + at: string; + event: string; + status: number | null; + ok: boolean; + error: string | null; + } | null; + }; +}; export type DeleteWebhookMutationVariables = Exact<{ webhookId: string; }>; - export type DeleteWebhookMutation = { deleteWebhook: boolean }; export type TestWebhookMutationVariables = Exact<{ webhookId: string; }>; +export type TestWebhookMutation = { + testWebhook: { + at: string; + event: string; + status: number | null; + ok: boolean; + error: string | null; + }; +}; -export type TestWebhookMutation = { testWebhook: { at: string, event: string, status: number | null, ok: boolean, error: string | null } }; - -export const UserRefFieldsFragmentDoc = {"kind":"Document","definitions":[{"kind":"FragmentDefinition","name":{"kind":"Name","value":"UserRefFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"UserRef"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}}]} as unknown as DocumentNode; -export const AutomationFieldsFragmentDoc = {"kind":"Document","definitions":[{"kind":"FragmentDefinition","name":{"kind":"Name","value":"AutomationFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Automation"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"active"}},{"kind":"Field","name":{"kind":"Name","value":"runs"}},{"kind":"Field","name":{"kind":"Name","value":"lastRunAt"}},{"kind":"Field","name":{"kind":"Name","value":"lastError"}},{"kind":"Field","name":{"kind":"Name","value":"trigger"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"kind"}},{"kind":"Field","name":{"kind":"Name","value":"status"}}]}},{"kind":"Field","name":{"kind":"Name","value":"conditions"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"types"}},{"kind":"Field","name":{"kind":"Name","value":"priorities"}},{"kind":"Field","name":{"kind":"Name","value":"areas"}},{"kind":"Field","name":{"kind":"Name","value":"label"}}]}},{"kind":"Field","name":{"kind":"Name","value":"action"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"kind"}},{"kind":"Field","name":{"kind":"Name","value":"value"}}]}},{"kind":"Field","name":{"kind":"Name","value":"createdBy"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"UserRefFields"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"UserRefFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"UserRef"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}}]} as unknown as DocumentNode; -export const ProjectFieldsFragmentDoc = {"kind":"Document","definitions":[{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ProjectFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Project"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"key"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"isPublic"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"version"}},{"kind":"Field","name":{"kind":"Name","value":"owner"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"UserRefFields"}}]}},{"kind":"Field","name":{"kind":"Name","value":"members"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"role"}},{"kind":"Field","name":{"kind":"Name","value":"user"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"UserRefFields"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"settings"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"statuses"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"category"}},{"kind":"Field","name":{"kind":"Name","value":"color"}},{"kind":"Field","name":{"kind":"Name","value":"requiresReason"}},{"kind":"Field","name":{"kind":"Name","value":"archived"}},{"kind":"Field","name":{"kind":"Name","value":"wipLimit"}}]}},{"kind":"Field","name":{"kind":"Name","value":"transitions"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"from"}},{"kind":"Field","name":{"kind":"Name","value":"to"}}]}},{"kind":"Field","name":{"kind":"Name","value":"issueTypes"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"icon"}},{"kind":"Field","name":{"kind":"Name","value":"color"}},{"kind":"Field","name":{"kind":"Name","value":"archived"}},{"kind":"Field","name":{"kind":"Name","value":"template"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"checklist"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"areas"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"archived"}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"UserRefFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"UserRef"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}}]} as unknown as DocumentNode; -export const IssueSummaryFieldsFragmentDoc = {"kind":"Document","definitions":[{"kind":"FragmentDefinition","name":{"kind":"Name","value":"IssueSummaryFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Issue"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"projectId"}},{"kind":"Field","name":{"kind":"Name","value":"key"}},{"kind":"Field","name":{"kind":"Name","value":"type"}},{"kind":"Field","name":{"kind":"Name","value":"area"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"status"}},{"kind":"Field","name":{"kind":"Name","value":"statusCategory"}},{"kind":"Field","name":{"kind":"Name","value":"priority"}},{"kind":"Field","name":{"kind":"Name","value":"labels"}},{"kind":"Field","name":{"kind":"Name","value":"commentCount"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"version"}},{"kind":"Field","name":{"kind":"Name","value":"assignee"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"UserRefFields"}}]}},{"kind":"Field","name":{"kind":"Name","value":"release"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"Field","name":{"kind":"Name","value":"sprint"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"Field","name":{"kind":"Name","value":"parent"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"key"}},{"kind":"Field","name":{"kind":"Name","value":"title"}}]}},{"kind":"Field","name":{"kind":"Name","value":"rank"}},{"kind":"Field","name":{"kind":"Name","value":"storyPoints"}},{"kind":"Field","name":{"kind":"Name","value":"startDate"}},{"kind":"Field","name":{"kind":"Name","value":"dueDate"}},{"kind":"Field","name":{"kind":"Name","value":"trashedAt"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"UserRefFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"UserRef"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}}]} as unknown as DocumentNode; -export const IssueFieldsFragmentDoc = {"kind":"Document","definitions":[{"kind":"FragmentDefinition","name":{"kind":"Name","value":"IssueFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Issue"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"IssueSummaryFields"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"figmaUrl"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"allowedTransitions"}},{"kind":"Field","name":{"kind":"Name","value":"reporter"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"UserRefFields"}}]}},{"kind":"Field","name":{"kind":"Name","value":"links"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"type"}},{"kind":"Field","name":{"kind":"Name","value":"direction"}},{"kind":"Field","name":{"kind":"Name","value":"issueId"}},{"kind":"Field","name":{"kind":"Name","value":"issueKey"}}]}},{"kind":"Field","name":{"kind":"Name","value":"watchers"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"UserRefFields"}}]}},{"kind":"Field","name":{"kind":"Name","value":"checklist"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"text"}},{"kind":"Field","name":{"kind":"Name","value":"done"}}]}},{"kind":"Field","name":{"kind":"Name","value":"devLinks"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"kind"}},{"kind":"Field","name":{"kind":"Name","value":"url"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"ref"}},{"kind":"Field","name":{"kind":"Name","value":"state"}},{"kind":"Field","name":{"kind":"Name","value":"provider"}},{"kind":"Field","name":{"kind":"Name","value":"repository"}},{"kind":"Field","name":{"kind":"Name","value":"author"}},{"kind":"Field","name":{"kind":"Name","value":"at"}}]}},{"kind":"Field","name":{"kind":"Name","value":"attachments"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"fileName"}},{"kind":"Field","name":{"kind":"Name","value":"mimeType"}},{"kind":"Field","name":{"kind":"Name","value":"size"}},{"kind":"Field","name":{"kind":"Name","value":"uploadedAt"}},{"kind":"Field","name":{"kind":"Name","value":"commentId"}},{"kind":"Field","name":{"kind":"Name","value":"uploadedBy"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"UserRefFields"}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"UserRefFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"UserRef"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"IssueSummaryFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Issue"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"projectId"}},{"kind":"Field","name":{"kind":"Name","value":"key"}},{"kind":"Field","name":{"kind":"Name","value":"type"}},{"kind":"Field","name":{"kind":"Name","value":"area"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"status"}},{"kind":"Field","name":{"kind":"Name","value":"statusCategory"}},{"kind":"Field","name":{"kind":"Name","value":"priority"}},{"kind":"Field","name":{"kind":"Name","value":"labels"}},{"kind":"Field","name":{"kind":"Name","value":"commentCount"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"version"}},{"kind":"Field","name":{"kind":"Name","value":"assignee"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"UserRefFields"}}]}},{"kind":"Field","name":{"kind":"Name","value":"release"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"Field","name":{"kind":"Name","value":"sprint"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"Field","name":{"kind":"Name","value":"parent"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"key"}},{"kind":"Field","name":{"kind":"Name","value":"title"}}]}},{"kind":"Field","name":{"kind":"Name","value":"rank"}},{"kind":"Field","name":{"kind":"Name","value":"storyPoints"}},{"kind":"Field","name":{"kind":"Name","value":"startDate"}},{"kind":"Field","name":{"kind":"Name","value":"dueDate"}},{"kind":"Field","name":{"kind":"Name","value":"trashedAt"}}]}}]} as unknown as DocumentNode; -export const CommentFieldsFragmentDoc = {"kind":"Document","definitions":[{"kind":"FragmentDefinition","name":{"kind":"Name","value":"CommentFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Comment"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"issueId"}},{"kind":"Field","name":{"kind":"Name","value":"body"}},{"kind":"Field","name":{"kind":"Name","value":"replyTo"}},{"kind":"Field","name":{"kind":"Name","value":"deleted"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"editedAt"}},{"kind":"Field","name":{"kind":"Name","value":"author"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"UserRefFields"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"UserRefFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"UserRef"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}}]} as unknown as DocumentNode; -export const ReleaseFieldsFragmentDoc = {"kind":"Document","definitions":[{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ReleaseFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Release"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"projectId"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"targetDate"}},{"kind":"Field","name":{"kind":"Name","value":"status"}},{"kind":"Field","name":{"kind":"Name","value":"releasedAt"}},{"kind":"Field","name":{"kind":"Name","value":"notes"}}]}}]} as unknown as DocumentNode; -export const ActivityFieldsFragmentDoc = {"kind":"Document","definitions":[{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ActivityFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Activity"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"type"}},{"kind":"Field","name":{"kind":"Name","value":"issueId"}},{"kind":"Field","name":{"kind":"Name","value":"issueKey"}},{"kind":"Field","name":{"kind":"Name","value":"summary"}},{"kind":"Field","name":{"kind":"Name","value":"occurredAt"}},{"kind":"Field","name":{"kind":"Name","value":"actor"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"UserRefFields"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"UserRefFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"UserRef"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}}]} as unknown as DocumentNode; -export const CommandResultFieldsFragmentDoc = {"kind":"Document","definitions":[{"kind":"FragmentDefinition","name":{"kind":"Name","value":"CommandResultFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"CommandResult"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"key"}},{"kind":"Field","name":{"kind":"Name","value":"version"}}]}}]} as unknown as DocumentNode; -export const GitRepositoryFieldsFragmentDoc = {"kind":"Document","definitions":[{"kind":"FragmentDefinition","name":{"kind":"Name","value":"GitRepositoryFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"GitRepository"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"secret"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}}]}}]} as unknown as DocumentNode; -export const NotificationFieldsFragmentDoc = {"kind":"Document","definitions":[{"kind":"FragmentDefinition","name":{"kind":"Name","value":"NotificationFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Notification"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"kind"}},{"kind":"Field","name":{"kind":"Name","value":"projectId"}},{"kind":"Field","name":{"kind":"Name","value":"projectKey"}},{"kind":"Field","name":{"kind":"Name","value":"issueId"}},{"kind":"Field","name":{"kind":"Name","value":"issueKey"}},{"kind":"Field","name":{"kind":"Name","value":"summary"}},{"kind":"Field","name":{"kind":"Name","value":"readAt"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"actor"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"UserRefFields"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"UserRefFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"UserRef"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}}]} as unknown as DocumentNode; -export const SavedFilterFieldsFragmentDoc = {"kind":"Document","definitions":[{"kind":"FragmentDefinition","name":{"kind":"Name","value":"SavedFilterFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"SavedFilter"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"projectId"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"shared"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"owner"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"UserRefFields"}}]}},{"kind":"Field","name":{"kind":"Name","value":"criteria"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"types"}},{"kind":"Field","name":{"kind":"Name","value":"areas"}},{"kind":"Field","name":{"kind":"Name","value":"priorities"}},{"kind":"Field","name":{"kind":"Name","value":"assigneeId"}},{"kind":"Field","name":{"kind":"Name","value":"unassigned"}},{"kind":"Field","name":{"kind":"Name","value":"releaseId"}},{"kind":"Field","name":{"kind":"Name","value":"labels"}},{"kind":"Field","name":{"kind":"Name","value":"search"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"UserRefFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"UserRef"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}}]} as unknown as DocumentNode; -export const SprintFieldsFragmentDoc = {"kind":"Document","definitions":[{"kind":"FragmentDefinition","name":{"kind":"Name","value":"SprintFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Sprint"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"projectId"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"goal"}},{"kind":"Field","name":{"kind":"Name","value":"startDate"}},{"kind":"Field","name":{"kind":"Name","value":"endDate"}},{"kind":"Field","name":{"kind":"Name","value":"status"}},{"kind":"Field","name":{"kind":"Name","value":"startedAt"}},{"kind":"Field","name":{"kind":"Name","value":"closedAt"}},{"kind":"Field","name":{"kind":"Name","value":"progress"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"total"}},{"kind":"Field","name":{"kind":"Name","value":"finished"}},{"kind":"Field","name":{"kind":"Name","value":"percent"}},{"kind":"Field","name":{"kind":"Name","value":"storyPoints"}},{"kind":"Field","name":{"kind":"Name","value":"finishedStoryPoints"}}]}}]}}]} as unknown as DocumentNode; -export const WebhookDeliveryFieldsFragmentDoc = {"kind":"Document","definitions":[{"kind":"FragmentDefinition","name":{"kind":"Name","value":"WebhookDeliveryFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"WebhookDelivery"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"at"}},{"kind":"Field","name":{"kind":"Name","value":"event"}},{"kind":"Field","name":{"kind":"Name","value":"status"}},{"kind":"Field","name":{"kind":"Name","value":"ok"}},{"kind":"Field","name":{"kind":"Name","value":"error"}}]}}]} as unknown as DocumentNode; -export const WebhookFieldsFragmentDoc = {"kind":"Document","definitions":[{"kind":"FragmentDefinition","name":{"kind":"Name","value":"WebhookFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Webhook"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"url"}},{"kind":"Field","name":{"kind":"Name","value":"events"}},{"kind":"Field","name":{"kind":"Name","value":"active"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"createdBy"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"UserRefFields"}}]}},{"kind":"Field","name":{"kind":"Name","value":"lastDelivery"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WebhookDeliveryFields"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"UserRefFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"UserRef"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"WebhookDeliveryFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"WebhookDelivery"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"at"}},{"kind":"Field","name":{"kind":"Name","value":"event"}},{"kind":"Field","name":{"kind":"Name","value":"status"}},{"kind":"Field","name":{"kind":"Name","value":"ok"}},{"kind":"Field","name":{"kind":"Name","value":"error"}}]}}]} as unknown as DocumentNode; -export const AutomationsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"Automations"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"projectId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"automations"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"projectId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"projectId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"AutomationFields"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"UserRefFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"UserRef"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"AutomationFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Automation"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"active"}},{"kind":"Field","name":{"kind":"Name","value":"runs"}},{"kind":"Field","name":{"kind":"Name","value":"lastRunAt"}},{"kind":"Field","name":{"kind":"Name","value":"lastError"}},{"kind":"Field","name":{"kind":"Name","value":"trigger"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"kind"}},{"kind":"Field","name":{"kind":"Name","value":"status"}}]}},{"kind":"Field","name":{"kind":"Name","value":"conditions"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"types"}},{"kind":"Field","name":{"kind":"Name","value":"priorities"}},{"kind":"Field","name":{"kind":"Name","value":"areas"}},{"kind":"Field","name":{"kind":"Name","value":"label"}}]}},{"kind":"Field","name":{"kind":"Name","value":"action"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"kind"}},{"kind":"Field","name":{"kind":"Name","value":"value"}}]}},{"kind":"Field","name":{"kind":"Name","value":"createdBy"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"UserRefFields"}}]}}]}}]} as unknown as DocumentNode; -export const CreateAutomationDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"CreateAutomation"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"CreateAutomationInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"createAutomation"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"AutomationFields"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"UserRefFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"UserRef"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"AutomationFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Automation"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"active"}},{"kind":"Field","name":{"kind":"Name","value":"runs"}},{"kind":"Field","name":{"kind":"Name","value":"lastRunAt"}},{"kind":"Field","name":{"kind":"Name","value":"lastError"}},{"kind":"Field","name":{"kind":"Name","value":"trigger"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"kind"}},{"kind":"Field","name":{"kind":"Name","value":"status"}}]}},{"kind":"Field","name":{"kind":"Name","value":"conditions"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"types"}},{"kind":"Field","name":{"kind":"Name","value":"priorities"}},{"kind":"Field","name":{"kind":"Name","value":"areas"}},{"kind":"Field","name":{"kind":"Name","value":"label"}}]}},{"kind":"Field","name":{"kind":"Name","value":"action"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"kind"}},{"kind":"Field","name":{"kind":"Name","value":"value"}}]}},{"kind":"Field","name":{"kind":"Name","value":"createdBy"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"UserRefFields"}}]}}]}}]} as unknown as DocumentNode; -export const UpdateAutomationDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"UpdateAutomation"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"automationId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"name"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"active"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"Boolean"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"updateAutomation"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"automationId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"automationId"}}},{"kind":"Argument","name":{"kind":"Name","value":"name"},"value":{"kind":"Variable","name":{"kind":"Name","value":"name"}}},{"kind":"Argument","name":{"kind":"Name","value":"active"},"value":{"kind":"Variable","name":{"kind":"Name","value":"active"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"AutomationFields"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"UserRefFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"UserRef"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"AutomationFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Automation"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"active"}},{"kind":"Field","name":{"kind":"Name","value":"runs"}},{"kind":"Field","name":{"kind":"Name","value":"lastRunAt"}},{"kind":"Field","name":{"kind":"Name","value":"lastError"}},{"kind":"Field","name":{"kind":"Name","value":"trigger"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"kind"}},{"kind":"Field","name":{"kind":"Name","value":"status"}}]}},{"kind":"Field","name":{"kind":"Name","value":"conditions"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"types"}},{"kind":"Field","name":{"kind":"Name","value":"priorities"}},{"kind":"Field","name":{"kind":"Name","value":"areas"}},{"kind":"Field","name":{"kind":"Name","value":"label"}}]}},{"kind":"Field","name":{"kind":"Name","value":"action"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"kind"}},{"kind":"Field","name":{"kind":"Name","value":"value"}}]}},{"kind":"Field","name":{"kind":"Name","value":"createdBy"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"UserRefFields"}}]}}]}}]} as unknown as DocumentNode; -export const DeleteAutomationDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"DeleteAutomation"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"automationId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"deleteAutomation"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"automationId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"automationId"}}}]}]}}]} as unknown as DocumentNode; -export const GitIntegrationDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GitIntegration"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"projectId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"gitIntegration"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"projectId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"projectId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"enabled"}},{"kind":"Field","name":{"kind":"Name","value":"webhookPath"}},{"kind":"Field","name":{"kind":"Name","value":"repositories"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"GitRepositoryFields"}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"GitRepositoryFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"GitRepository"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"secret"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}}]}}]} as unknown as DocumentNode; -export const AddGitRepositoryDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"AddGitRepository"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"projectId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"name"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"addGitRepository"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"projectId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"projectId"}}},{"kind":"Argument","name":{"kind":"Name","value":"name"},"value":{"kind":"Variable","name":{"kind":"Name","value":"name"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"GitRepositoryFields"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"GitRepositoryFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"GitRepository"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"secret"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}}]}}]} as unknown as DocumentNode; -export const RotateGitRepositorySecretDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"RotateGitRepositorySecret"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"projectId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"repositoryId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"rotateGitRepositorySecret"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"projectId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"projectId"}}},{"kind":"Argument","name":{"kind":"Name","value":"repositoryId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"repositoryId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"GitRepositoryFields"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"GitRepositoryFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"GitRepository"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"secret"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}}]}}]} as unknown as DocumentNode; -export const RemoveGitRepositoryDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"RemoveGitRepository"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"projectId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"repositoryId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"removeGitRepository"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"projectId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"projectId"}}},{"kind":"Argument","name":{"kind":"Name","value":"repositoryId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"repositoryId"}}}]}]}}]} as unknown as DocumentNode; -export const BoardDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"Board"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"idOrKey"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"releaseId"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"assigneeId"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"area"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"types"}},"type":{"kind":"ListType","type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"priorities"}},"type":{"kind":"ListType","type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"IssuePriority"}}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"labels"}},"type":{"kind":"ListType","type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"search"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"unassigned"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"Boolean"}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"sprintId"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"project"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"idOrKey"},"value":{"kind":"Variable","name":{"kind":"Name","value":"idOrKey"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"board"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"releaseId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"releaseId"}}},{"kind":"Argument","name":{"kind":"Name","value":"assigneeId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"assigneeId"}}},{"kind":"Argument","name":{"kind":"Name","value":"area"},"value":{"kind":"Variable","name":{"kind":"Name","value":"area"}}},{"kind":"Argument","name":{"kind":"Name","value":"types"},"value":{"kind":"Variable","name":{"kind":"Name","value":"types"}}},{"kind":"Argument","name":{"kind":"Name","value":"priorities"},"value":{"kind":"Variable","name":{"kind":"Name","value":"priorities"}}},{"kind":"Argument","name":{"kind":"Name","value":"labels"},"value":{"kind":"Variable","name":{"kind":"Name","value":"labels"}}},{"kind":"Argument","name":{"kind":"Name","value":"search"},"value":{"kind":"Variable","name":{"kind":"Name","value":"search"}}},{"kind":"Argument","name":{"kind":"Name","value":"unassigned"},"value":{"kind":"Variable","name":{"kind":"Name","value":"unassigned"}}},{"kind":"Argument","name":{"kind":"Name","value":"sprintId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"sprintId"}}},{"kind":"Argument","name":{"kind":"Name","value":"perColumn"},"value":{"kind":"IntValue","value":"100"}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"status"}},{"kind":"Field","name":{"kind":"Name","value":"total"}},{"kind":"Field","name":{"kind":"Name","value":"issues"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"IssueSummaryFields"}}]}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"UserRefFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"UserRef"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"IssueSummaryFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Issue"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"projectId"}},{"kind":"Field","name":{"kind":"Name","value":"key"}},{"kind":"Field","name":{"kind":"Name","value":"type"}},{"kind":"Field","name":{"kind":"Name","value":"area"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"status"}},{"kind":"Field","name":{"kind":"Name","value":"statusCategory"}},{"kind":"Field","name":{"kind":"Name","value":"priority"}},{"kind":"Field","name":{"kind":"Name","value":"labels"}},{"kind":"Field","name":{"kind":"Name","value":"commentCount"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"version"}},{"kind":"Field","name":{"kind":"Name","value":"assignee"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"UserRefFields"}}]}},{"kind":"Field","name":{"kind":"Name","value":"release"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"Field","name":{"kind":"Name","value":"sprint"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"Field","name":{"kind":"Name","value":"parent"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"key"}},{"kind":"Field","name":{"kind":"Name","value":"title"}}]}},{"kind":"Field","name":{"kind":"Name","value":"rank"}},{"kind":"Field","name":{"kind":"Name","value":"storyPoints"}},{"kind":"Field","name":{"kind":"Name","value":"startDate"}},{"kind":"Field","name":{"kind":"Name","value":"dueDate"}},{"kind":"Field","name":{"kind":"Name","value":"trashedAt"}}]}}]} as unknown as DocumentNode; -export const IssueDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"Issue"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"idOrKey"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"issue"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"idOrKey"},"value":{"kind":"Variable","name":{"kind":"Name","value":"idOrKey"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"IssueFields"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"UserRefFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"UserRef"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"IssueSummaryFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Issue"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"projectId"}},{"kind":"Field","name":{"kind":"Name","value":"key"}},{"kind":"Field","name":{"kind":"Name","value":"type"}},{"kind":"Field","name":{"kind":"Name","value":"area"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"status"}},{"kind":"Field","name":{"kind":"Name","value":"statusCategory"}},{"kind":"Field","name":{"kind":"Name","value":"priority"}},{"kind":"Field","name":{"kind":"Name","value":"labels"}},{"kind":"Field","name":{"kind":"Name","value":"commentCount"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"version"}},{"kind":"Field","name":{"kind":"Name","value":"assignee"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"UserRefFields"}}]}},{"kind":"Field","name":{"kind":"Name","value":"release"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"Field","name":{"kind":"Name","value":"sprint"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"Field","name":{"kind":"Name","value":"parent"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"key"}},{"kind":"Field","name":{"kind":"Name","value":"title"}}]}},{"kind":"Field","name":{"kind":"Name","value":"rank"}},{"kind":"Field","name":{"kind":"Name","value":"storyPoints"}},{"kind":"Field","name":{"kind":"Name","value":"startDate"}},{"kind":"Field","name":{"kind":"Name","value":"dueDate"}},{"kind":"Field","name":{"kind":"Name","value":"trashedAt"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"IssueFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Issue"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"IssueSummaryFields"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"figmaUrl"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"allowedTransitions"}},{"kind":"Field","name":{"kind":"Name","value":"reporter"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"UserRefFields"}}]}},{"kind":"Field","name":{"kind":"Name","value":"links"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"type"}},{"kind":"Field","name":{"kind":"Name","value":"direction"}},{"kind":"Field","name":{"kind":"Name","value":"issueId"}},{"kind":"Field","name":{"kind":"Name","value":"issueKey"}}]}},{"kind":"Field","name":{"kind":"Name","value":"watchers"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"UserRefFields"}}]}},{"kind":"Field","name":{"kind":"Name","value":"checklist"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"text"}},{"kind":"Field","name":{"kind":"Name","value":"done"}}]}},{"kind":"Field","name":{"kind":"Name","value":"devLinks"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"kind"}},{"kind":"Field","name":{"kind":"Name","value":"url"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"ref"}},{"kind":"Field","name":{"kind":"Name","value":"state"}},{"kind":"Field","name":{"kind":"Name","value":"provider"}},{"kind":"Field","name":{"kind":"Name","value":"repository"}},{"kind":"Field","name":{"kind":"Name","value":"author"}},{"kind":"Field","name":{"kind":"Name","value":"at"}}]}},{"kind":"Field","name":{"kind":"Name","value":"attachments"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"fileName"}},{"kind":"Field","name":{"kind":"Name","value":"mimeType"}},{"kind":"Field","name":{"kind":"Name","value":"size"}},{"kind":"Field","name":{"kind":"Name","value":"uploadedAt"}},{"kind":"Field","name":{"kind":"Name","value":"commentId"}},{"kind":"Field","name":{"kind":"Name","value":"uploadedBy"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"UserRefFields"}}]}}]}}]}}]} as unknown as DocumentNode; -export const SearchIssuesDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"SearchIssues"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"filter"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"IssueFilterInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"issues"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"filter"},"value":{"kind":"Variable","name":{"kind":"Name","value":"filter"}}},{"kind":"Argument","name":{"kind":"Name","value":"limit"},"value":{"kind":"IntValue","value":"20"}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"items"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"IssueSummaryFields"}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"UserRefFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"UserRef"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"IssueSummaryFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Issue"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"projectId"}},{"kind":"Field","name":{"kind":"Name","value":"key"}},{"kind":"Field","name":{"kind":"Name","value":"type"}},{"kind":"Field","name":{"kind":"Name","value":"area"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"status"}},{"kind":"Field","name":{"kind":"Name","value":"statusCategory"}},{"kind":"Field","name":{"kind":"Name","value":"priority"}},{"kind":"Field","name":{"kind":"Name","value":"labels"}},{"kind":"Field","name":{"kind":"Name","value":"commentCount"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"version"}},{"kind":"Field","name":{"kind":"Name","value":"assignee"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"UserRefFields"}}]}},{"kind":"Field","name":{"kind":"Name","value":"release"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"Field","name":{"kind":"Name","value":"sprint"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"Field","name":{"kind":"Name","value":"parent"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"key"}},{"kind":"Field","name":{"kind":"Name","value":"title"}}]}},{"kind":"Field","name":{"kind":"Name","value":"rank"}},{"kind":"Field","name":{"kind":"Name","value":"storyPoints"}},{"kind":"Field","name":{"kind":"Name","value":"startDate"}},{"kind":"Field","name":{"kind":"Name","value":"dueDate"}},{"kind":"Field","name":{"kind":"Name","value":"trashedAt"}}]}}]} as unknown as DocumentNode; -export const CreateIssueDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"CreateIssue"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"CreateIssueInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"createIssue"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"CommandResultFields"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"CommandResultFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"CommandResult"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"key"}},{"kind":"Field","name":{"kind":"Name","value":"version"}}]}}]} as unknown as DocumentNode; -export const UpdateIssueDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"UpdateIssue"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"UpdateIssueInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"updateIssue"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"CommandResultFields"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"CommandResultFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"CommandResult"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"key"}},{"kind":"Field","name":{"kind":"Name","value":"version"}}]}}]} as unknown as DocumentNode; -export const ChangeIssueStatusDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"ChangeIssueStatus"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ChangeIssueStatusInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"changeIssueStatus"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"CommandResultFields"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"CommandResultFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"CommandResult"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"key"}},{"kind":"Field","name":{"kind":"Name","value":"version"}}]}}]} as unknown as DocumentNode; -export const AssignIssueDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"AssignIssue"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"issueId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"assigneeId"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"assignIssue"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"issueId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"issueId"}}},{"kind":"Argument","name":{"kind":"Name","value":"assigneeId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"assigneeId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"CommandResultFields"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"CommandResultFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"CommandResult"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"key"}},{"kind":"Field","name":{"kind":"Name","value":"version"}}]}}]} as unknown as DocumentNode; -export const LinkIssuesDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"LinkIssues"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"LinkIssuesInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"linkIssues"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"CommandResultFields"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"CommandResultFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"CommandResult"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"key"}},{"kind":"Field","name":{"kind":"Name","value":"version"}}]}}]} as unknown as DocumentNode; -export const UnlinkIssuesDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"UnlinkIssues"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"LinkIssuesInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"unlinkIssues"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"CommandResultFields"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"CommandResultFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"CommandResult"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"key"}},{"kind":"Field","name":{"kind":"Name","value":"version"}}]}}]} as unknown as DocumentNode; -export const WatchIssueDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"WatchIssue"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"issueId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"watchIssue"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"issueId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"issueId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"CommandResultFields"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"CommandResultFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"CommandResult"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"key"}},{"kind":"Field","name":{"kind":"Name","value":"version"}}]}}]} as unknown as DocumentNode; -export const UnwatchIssueDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"UnwatchIssue"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"issueId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"unwatchIssue"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"issueId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"issueId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"CommandResultFields"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"CommandResultFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"CommandResult"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"key"}},{"kind":"Field","name":{"kind":"Name","value":"version"}}]}}]} as unknown as DocumentNode; -export const SetIssueReleaseDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"SetIssueRelease"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"issueId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"releaseId"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"setIssueRelease"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"issueId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"issueId"}}},{"kind":"Argument","name":{"kind":"Name","value":"releaseId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"releaseId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"CommandResultFields"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"CommandResultFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"CommandResult"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"key"}},{"kind":"Field","name":{"kind":"Name","value":"version"}}]}}]} as unknown as DocumentNode; -export const IssueCommentsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"IssueComments"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"idOrKey"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"issue"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"idOrKey"},"value":{"kind":"Variable","name":{"kind":"Name","value":"idOrKey"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"comments"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"limit"},"value":{"kind":"IntValue","value":"200"}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"items"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"CommentFields"}}]}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"UserRefFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"UserRef"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"CommentFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Comment"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"issueId"}},{"kind":"Field","name":{"kind":"Name","value":"body"}},{"kind":"Field","name":{"kind":"Name","value":"replyTo"}},{"kind":"Field","name":{"kind":"Name","value":"deleted"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"editedAt"}},{"kind":"Field","name":{"kind":"Name","value":"author"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"UserRefFields"}}]}}]}}]} as unknown as DocumentNode; -export const AddCommentDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"AddComment"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"issueId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"body"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"replyTo"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"addComment"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"issueId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"issueId"}}},{"kind":"Argument","name":{"kind":"Name","value":"body"},"value":{"kind":"Variable","name":{"kind":"Name","value":"body"}}},{"kind":"Argument","name":{"kind":"Name","value":"replyTo"},"value":{"kind":"Variable","name":{"kind":"Name","value":"replyTo"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"CommandResultFields"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"CommandResultFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"CommandResult"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"key"}},{"kind":"Field","name":{"kind":"Name","value":"version"}}]}}]} as unknown as DocumentNode; -export const EditCommentDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"EditComment"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"commentId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"body"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"editComment"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"commentId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"commentId"}}},{"kind":"Argument","name":{"kind":"Name","value":"body"},"value":{"kind":"Variable","name":{"kind":"Name","value":"body"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"CommandResultFields"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"CommandResultFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"CommandResult"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"key"}},{"kind":"Field","name":{"kind":"Name","value":"version"}}]}}]} as unknown as DocumentNode; -export const DeleteCommentDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"DeleteComment"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"commentId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"deleteComment"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"commentId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"commentId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"CommandResultFields"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"CommandResultFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"CommandResult"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"key"}},{"kind":"Field","name":{"kind":"Name","value":"version"}}]}}]} as unknown as DocumentNode; -export const MyIssuesDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"MyIssues"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"assignedToMe"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"Boolean"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"watching"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"Boolean"}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"categories"}},"type":{"kind":"ListType","type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"StatusCategory"}}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"limit"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"Int"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"search"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"myIssues"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"assignedToMe"},"value":{"kind":"Variable","name":{"kind":"Name","value":"assignedToMe"}}},{"kind":"Argument","name":{"kind":"Name","value":"watching"},"value":{"kind":"Variable","name":{"kind":"Name","value":"watching"}}},{"kind":"Argument","name":{"kind":"Name","value":"categories"},"value":{"kind":"Variable","name":{"kind":"Name","value":"categories"}}},{"kind":"Argument","name":{"kind":"Name","value":"limit"},"value":{"kind":"Variable","name":{"kind":"Name","value":"limit"}}},{"kind":"Argument","name":{"kind":"Name","value":"search"},"value":{"kind":"Variable","name":{"kind":"Name","value":"search"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"total"}},{"kind":"Field","name":{"kind":"Name","value":"items"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"IssueSummaryFields"}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"UserRefFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"UserRef"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"IssueSummaryFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Issue"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"projectId"}},{"kind":"Field","name":{"kind":"Name","value":"key"}},{"kind":"Field","name":{"kind":"Name","value":"type"}},{"kind":"Field","name":{"kind":"Name","value":"area"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"status"}},{"kind":"Field","name":{"kind":"Name","value":"statusCategory"}},{"kind":"Field","name":{"kind":"Name","value":"priority"}},{"kind":"Field","name":{"kind":"Name","value":"labels"}},{"kind":"Field","name":{"kind":"Name","value":"commentCount"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"version"}},{"kind":"Field","name":{"kind":"Name","value":"assignee"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"UserRefFields"}}]}},{"kind":"Field","name":{"kind":"Name","value":"release"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"Field","name":{"kind":"Name","value":"sprint"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"Field","name":{"kind":"Name","value":"parent"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"key"}},{"kind":"Field","name":{"kind":"Name","value":"title"}}]}},{"kind":"Field","name":{"kind":"Name","value":"rank"}},{"kind":"Field","name":{"kind":"Name","value":"storyPoints"}},{"kind":"Field","name":{"kind":"Name","value":"startDate"}},{"kind":"Field","name":{"kind":"Name","value":"dueDate"}},{"kind":"Field","name":{"kind":"Name","value":"trashedAt"}}]}}]} as unknown as DocumentNode; -export const IssueChildrenDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"IssueChildren"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"filter"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"IssueFilterInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"issues"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"filter"},"value":{"kind":"Variable","name":{"kind":"Name","value":"filter"}}},{"kind":"Argument","name":{"kind":"Name","value":"limit"},"value":{"kind":"IntValue","value":"200"}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"items"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"IssueSummaryFields"}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"UserRefFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"UserRef"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"IssueSummaryFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Issue"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"projectId"}},{"kind":"Field","name":{"kind":"Name","value":"key"}},{"kind":"Field","name":{"kind":"Name","value":"type"}},{"kind":"Field","name":{"kind":"Name","value":"area"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"status"}},{"kind":"Field","name":{"kind":"Name","value":"statusCategory"}},{"kind":"Field","name":{"kind":"Name","value":"priority"}},{"kind":"Field","name":{"kind":"Name","value":"labels"}},{"kind":"Field","name":{"kind":"Name","value":"commentCount"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"version"}},{"kind":"Field","name":{"kind":"Name","value":"assignee"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"UserRefFields"}}]}},{"kind":"Field","name":{"kind":"Name","value":"release"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"Field","name":{"kind":"Name","value":"sprint"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"Field","name":{"kind":"Name","value":"parent"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"key"}},{"kind":"Field","name":{"kind":"Name","value":"title"}}]}},{"kind":"Field","name":{"kind":"Name","value":"rank"}},{"kind":"Field","name":{"kind":"Name","value":"storyPoints"}},{"kind":"Field","name":{"kind":"Name","value":"startDate"}},{"kind":"Field","name":{"kind":"Name","value":"dueDate"}},{"kind":"Field","name":{"kind":"Name","value":"trashedAt"}}]}}]} as unknown as DocumentNode; -export const EpicsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"Epics"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"projectId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"epics"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"projectId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"projectId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"issue"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"IssueSummaryFields"}}]}},{"kind":"Field","name":{"kind":"Name","value":"progress"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"total"}},{"kind":"Field","name":{"kind":"Name","value":"finished"}},{"kind":"Field","name":{"kind":"Name","value":"percent"}},{"kind":"Field","name":{"kind":"Name","value":"storyPoints"}},{"kind":"Field","name":{"kind":"Name","value":"finishedStoryPoints"}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"UserRefFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"UserRef"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"IssueSummaryFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Issue"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"projectId"}},{"kind":"Field","name":{"kind":"Name","value":"key"}},{"kind":"Field","name":{"kind":"Name","value":"type"}},{"kind":"Field","name":{"kind":"Name","value":"area"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"status"}},{"kind":"Field","name":{"kind":"Name","value":"statusCategory"}},{"kind":"Field","name":{"kind":"Name","value":"priority"}},{"kind":"Field","name":{"kind":"Name","value":"labels"}},{"kind":"Field","name":{"kind":"Name","value":"commentCount"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"version"}},{"kind":"Field","name":{"kind":"Name","value":"assignee"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"UserRefFields"}}]}},{"kind":"Field","name":{"kind":"Name","value":"release"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"Field","name":{"kind":"Name","value":"sprint"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"Field","name":{"kind":"Name","value":"parent"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"key"}},{"kind":"Field","name":{"kind":"Name","value":"title"}}]}},{"kind":"Field","name":{"kind":"Name","value":"rank"}},{"kind":"Field","name":{"kind":"Name","value":"storyPoints"}},{"kind":"Field","name":{"kind":"Name","value":"startDate"}},{"kind":"Field","name":{"kind":"Name","value":"dueDate"}},{"kind":"Field","name":{"kind":"Name","value":"trashedAt"}}]}}]} as unknown as DocumentNode; -export const SetIssueParentDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"SetIssueParent"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"issueId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"parentId"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"setIssueParent"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"issueId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"issueId"}}},{"kind":"Argument","name":{"kind":"Name","value":"parentId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"parentId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"CommandResultFields"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"CommandResultFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"CommandResult"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"key"}},{"kind":"Field","name":{"kind":"Name","value":"version"}}]}}]} as unknown as DocumentNode; -export const AddChecklistItemDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"AddChecklistItem"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"AddChecklistItemInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"addChecklistItem"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"CommandResultFields"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"CommandResultFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"CommandResult"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"key"}},{"kind":"Field","name":{"kind":"Name","value":"version"}}]}}]} as unknown as DocumentNode; -export const UpdateChecklistItemDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"UpdateChecklistItem"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"UpdateChecklistItemInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"updateChecklistItem"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"CommandResultFields"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"CommandResultFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"CommandResult"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"key"}},{"kind":"Field","name":{"kind":"Name","value":"version"}}]}}]} as unknown as DocumentNode; -export const RemoveChecklistItemDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"RemoveChecklistItem"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"issueId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"itemId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"removeChecklistItem"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"issueId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"issueId"}}},{"kind":"Argument","name":{"kind":"Name","value":"itemId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"itemId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"CommandResultFields"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"CommandResultFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"CommandResult"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"key"}},{"kind":"Field","name":{"kind":"Name","value":"version"}}]}}]} as unknown as DocumentNode; -export const BacklogDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"Backlog"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"filter"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"IssueFilterInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"issues"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"filter"},"value":{"kind":"Variable","name":{"kind":"Name","value":"filter"}}},{"kind":"Argument","name":{"kind":"Name","value":"limit"},"value":{"kind":"IntValue","value":"200"}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"items"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"IssueSummaryFields"}}]}},{"kind":"Field","name":{"kind":"Name","value":"total"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"UserRefFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"UserRef"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"IssueSummaryFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Issue"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"projectId"}},{"kind":"Field","name":{"kind":"Name","value":"key"}},{"kind":"Field","name":{"kind":"Name","value":"type"}},{"kind":"Field","name":{"kind":"Name","value":"area"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"status"}},{"kind":"Field","name":{"kind":"Name","value":"statusCategory"}},{"kind":"Field","name":{"kind":"Name","value":"priority"}},{"kind":"Field","name":{"kind":"Name","value":"labels"}},{"kind":"Field","name":{"kind":"Name","value":"commentCount"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"version"}},{"kind":"Field","name":{"kind":"Name","value":"assignee"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"UserRefFields"}}]}},{"kind":"Field","name":{"kind":"Name","value":"release"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"Field","name":{"kind":"Name","value":"sprint"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"Field","name":{"kind":"Name","value":"parent"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"key"}},{"kind":"Field","name":{"kind":"Name","value":"title"}}]}},{"kind":"Field","name":{"kind":"Name","value":"rank"}},{"kind":"Field","name":{"kind":"Name","value":"storyPoints"}},{"kind":"Field","name":{"kind":"Name","value":"startDate"}},{"kind":"Field","name":{"kind":"Name","value":"dueDate"}},{"kind":"Field","name":{"kind":"Name","value":"trashedAt"}}]}}]} as unknown as DocumentNode; -export const RankIssueDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"RankIssue"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"RankIssueInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"rankIssue"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"CommandResultFields"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"CommandResultFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"CommandResult"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"key"}},{"kind":"Field","name":{"kind":"Name","value":"version"}}]}}]} as unknown as DocumentNode; -export const BulkUpdateIssuesDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"BulkUpdateIssues"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"BulkUpdateIssuesInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"bulkUpdateIssues"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"updated"}},{"kind":"Field","name":{"kind":"Name","value":"results"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"issueId"}},{"kind":"Field","name":{"kind":"Name","value":"ok"}},{"kind":"Field","name":{"kind":"Name","value":"error"}}]}}]}}]}}]} as unknown as DocumentNode; -export const TrashIssueDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"TrashIssue"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"issueId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"trashIssue"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"issueId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"issueId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"CommandResultFields"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"CommandResultFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"CommandResult"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"key"}},{"kind":"Field","name":{"kind":"Name","value":"version"}}]}}]} as unknown as DocumentNode; -export const RestoreIssueDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"RestoreIssue"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"issueId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"restoreIssue"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"issueId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"issueId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"CommandResultFields"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"CommandResultFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"CommandResult"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"key"}},{"kind":"Field","name":{"kind":"Name","value":"version"}}]}}]} as unknown as DocumentNode; -export const TrashDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"Trash"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"projectId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"trash"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"projectId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"projectId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"IssueSummaryFields"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"UserRefFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"UserRef"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"IssueSummaryFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Issue"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"projectId"}},{"kind":"Field","name":{"kind":"Name","value":"key"}},{"kind":"Field","name":{"kind":"Name","value":"type"}},{"kind":"Field","name":{"kind":"Name","value":"area"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"status"}},{"kind":"Field","name":{"kind":"Name","value":"statusCategory"}},{"kind":"Field","name":{"kind":"Name","value":"priority"}},{"kind":"Field","name":{"kind":"Name","value":"labels"}},{"kind":"Field","name":{"kind":"Name","value":"commentCount"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"version"}},{"kind":"Field","name":{"kind":"Name","value":"assignee"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"UserRefFields"}}]}},{"kind":"Field","name":{"kind":"Name","value":"release"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"Field","name":{"kind":"Name","value":"sprint"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"Field","name":{"kind":"Name","value":"parent"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"key"}},{"kind":"Field","name":{"kind":"Name","value":"title"}}]}},{"kind":"Field","name":{"kind":"Name","value":"rank"}},{"kind":"Field","name":{"kind":"Name","value":"storyPoints"}},{"kind":"Field","name":{"kind":"Name","value":"startDate"}},{"kind":"Field","name":{"kind":"Name","value":"dueDate"}},{"kind":"Field","name":{"kind":"Name","value":"trashedAt"}}]}}]} as unknown as DocumentNode; -export const DueIssuesDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"DueIssues"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"filter"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"IssueFilterInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"issues"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"filter"},"value":{"kind":"Variable","name":{"kind":"Name","value":"filter"}}},{"kind":"Argument","name":{"kind":"Name","value":"limit"},"value":{"kind":"IntValue","value":"200"}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"items"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"IssueSummaryFields"}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"UserRefFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"UserRef"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"IssueSummaryFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Issue"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"projectId"}},{"kind":"Field","name":{"kind":"Name","value":"key"}},{"kind":"Field","name":{"kind":"Name","value":"type"}},{"kind":"Field","name":{"kind":"Name","value":"area"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"status"}},{"kind":"Field","name":{"kind":"Name","value":"statusCategory"}},{"kind":"Field","name":{"kind":"Name","value":"priority"}},{"kind":"Field","name":{"kind":"Name","value":"labels"}},{"kind":"Field","name":{"kind":"Name","value":"commentCount"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"version"}},{"kind":"Field","name":{"kind":"Name","value":"assignee"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"UserRefFields"}}]}},{"kind":"Field","name":{"kind":"Name","value":"release"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"Field","name":{"kind":"Name","value":"sprint"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"Field","name":{"kind":"Name","value":"parent"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"key"}},{"kind":"Field","name":{"kind":"Name","value":"title"}}]}},{"kind":"Field","name":{"kind":"Name","value":"rank"}},{"kind":"Field","name":{"kind":"Name","value":"storyPoints"}},{"kind":"Field","name":{"kind":"Name","value":"startDate"}},{"kind":"Field","name":{"kind":"Name","value":"dueDate"}},{"kind":"Field","name":{"kind":"Name","value":"trashedAt"}}]}}]} as unknown as DocumentNode; -export const MyNotificationsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"MyNotifications"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"unreadOnly"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"Boolean"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"limit"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"Int"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"myNotifications"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"unreadOnly"},"value":{"kind":"Variable","name":{"kind":"Name","value":"unreadOnly"}}},{"kind":"Argument","name":{"kind":"Name","value":"limit"},"value":{"kind":"Variable","name":{"kind":"Name","value":"limit"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"unread"}},{"kind":"Field","name":{"kind":"Name","value":"items"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"NotificationFields"}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"UserRefFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"UserRef"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"NotificationFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Notification"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"kind"}},{"kind":"Field","name":{"kind":"Name","value":"projectId"}},{"kind":"Field","name":{"kind":"Name","value":"projectKey"}},{"kind":"Field","name":{"kind":"Name","value":"issueId"}},{"kind":"Field","name":{"kind":"Name","value":"issueKey"}},{"kind":"Field","name":{"kind":"Name","value":"summary"}},{"kind":"Field","name":{"kind":"Name","value":"readAt"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"actor"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"UserRefFields"}}]}}]}}]} as unknown as DocumentNode; -export const NotificationSettingsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"NotificationSettings"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"notificationSettings"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"email"}},{"kind":"Field","name":{"kind":"Name","value":"emailAvailable"}}]}}]}}]} as unknown as DocumentNode; -export const MarkNotificationsReadDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"MarkNotificationsRead"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"ids"}},"type":{"kind":"ListType","type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"markNotificationsRead"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"ids"},"value":{"kind":"Variable","name":{"kind":"Name","value":"ids"}}}]}]}}]} as unknown as DocumentNode; -export const UpdateNotificationSettingsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"UpdateNotificationSettings"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"email"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"Boolean"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"updateNotificationSettings"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"email"},"value":{"kind":"Variable","name":{"kind":"Name","value":"email"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"email"}},{"kind":"Field","name":{"kind":"Name","value":"emailAvailable"}}]}}]}}]} as unknown as DocumentNode; -export const NotificationAddedDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"subscription","name":{"kind":"Name","value":"NotificationAdded"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"notificationAdded"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"NotificationFields"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"UserRefFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"UserRef"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"NotificationFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Notification"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"kind"}},{"kind":"Field","name":{"kind":"Name","value":"projectId"}},{"kind":"Field","name":{"kind":"Name","value":"projectKey"}},{"kind":"Field","name":{"kind":"Name","value":"issueId"}},{"kind":"Field","name":{"kind":"Name","value":"issueKey"}},{"kind":"Field","name":{"kind":"Name","value":"summary"}},{"kind":"Field","name":{"kind":"Name","value":"readAt"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"actor"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"UserRefFields"}}]}}]}}]} as unknown as DocumentNode; -export const MyProjectsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"MyProjects"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"myProjects"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"ProjectFields"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"UserRefFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"UserRef"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ProjectFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Project"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"key"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"isPublic"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"version"}},{"kind":"Field","name":{"kind":"Name","value":"owner"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"UserRefFields"}}]}},{"kind":"Field","name":{"kind":"Name","value":"members"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"role"}},{"kind":"Field","name":{"kind":"Name","value":"user"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"UserRefFields"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"settings"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"statuses"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"category"}},{"kind":"Field","name":{"kind":"Name","value":"color"}},{"kind":"Field","name":{"kind":"Name","value":"requiresReason"}},{"kind":"Field","name":{"kind":"Name","value":"archived"}},{"kind":"Field","name":{"kind":"Name","value":"wipLimit"}}]}},{"kind":"Field","name":{"kind":"Name","value":"transitions"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"from"}},{"kind":"Field","name":{"kind":"Name","value":"to"}}]}},{"kind":"Field","name":{"kind":"Name","value":"issueTypes"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"icon"}},{"kind":"Field","name":{"kind":"Name","value":"color"}},{"kind":"Field","name":{"kind":"Name","value":"archived"}},{"kind":"Field","name":{"kind":"Name","value":"template"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"checklist"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"areas"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"archived"}}]}}]}}]}}]} as unknown as DocumentNode; -export const ProjectDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"Project"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"idOrKey"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"project"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"idOrKey"},"value":{"kind":"Variable","name":{"kind":"Name","value":"idOrKey"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"ProjectFields"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"UserRefFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"UserRef"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ProjectFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Project"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"key"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"isPublic"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"version"}},{"kind":"Field","name":{"kind":"Name","value":"owner"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"UserRefFields"}}]}},{"kind":"Field","name":{"kind":"Name","value":"members"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"role"}},{"kind":"Field","name":{"kind":"Name","value":"user"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"UserRefFields"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"settings"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"statuses"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"category"}},{"kind":"Field","name":{"kind":"Name","value":"color"}},{"kind":"Field","name":{"kind":"Name","value":"requiresReason"}},{"kind":"Field","name":{"kind":"Name","value":"archived"}},{"kind":"Field","name":{"kind":"Name","value":"wipLimit"}}]}},{"kind":"Field","name":{"kind":"Name","value":"transitions"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"from"}},{"kind":"Field","name":{"kind":"Name","value":"to"}}]}},{"kind":"Field","name":{"kind":"Name","value":"issueTypes"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"icon"}},{"kind":"Field","name":{"kind":"Name","value":"color"}},{"kind":"Field","name":{"kind":"Name","value":"archived"}},{"kind":"Field","name":{"kind":"Name","value":"template"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"checklist"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"areas"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"archived"}}]}}]}}]}}]} as unknown as DocumentNode; -export const ProjectStatsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"ProjectStats"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"idOrKey"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"project"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"idOrKey"},"value":{"kind":"Variable","name":{"kind":"Name","value":"idOrKey"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"stats"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"total"}},{"kind":"Field","name":{"kind":"Name","value":"open"}},{"kind":"Field","name":{"kind":"Name","value":"byStatus"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"key"}},{"kind":"Field","name":{"kind":"Name","value":"count"}}]}},{"kind":"Field","name":{"kind":"Name","value":"byType"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"key"}},{"kind":"Field","name":{"kind":"Name","value":"count"}}]}},{"kind":"Field","name":{"kind":"Name","value":"byPriority"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"key"}},{"kind":"Field","name":{"kind":"Name","value":"count"}}]}},{"kind":"Field","name":{"kind":"Name","value":"byArea"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"key"}},{"kind":"Field","name":{"kind":"Name","value":"count"}}]}},{"kind":"Field","name":{"kind":"Name","value":"byAssignee"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"count"}},{"kind":"Field","name":{"kind":"Name","value":"user"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"UserRefFields"}}]}}]}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"UserRefFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"UserRef"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}}]} as unknown as DocumentNode; -export const CreateProjectDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"CreateProject"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"CreateProjectInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"createProject"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"CommandResultFields"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"CommandResultFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"CommandResult"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"key"}},{"kind":"Field","name":{"kind":"Name","value":"version"}}]}}]} as unknown as DocumentNode; -export const AddProjectMemberDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"AddProjectMember"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ProjectMemberInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"addProjectMember"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"CommandResultFields"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"CommandResultFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"CommandResult"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"key"}},{"kind":"Field","name":{"kind":"Name","value":"version"}}]}}]} as unknown as DocumentNode; -export const ChangeProjectMemberRoleDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"ChangeProjectMemberRole"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ProjectMemberInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"changeProjectMemberRole"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"CommandResultFields"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"CommandResultFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"CommandResult"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"key"}},{"kind":"Field","name":{"kind":"Name","value":"version"}}]}}]} as unknown as DocumentNode; -export const RemoveProjectMemberDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"RemoveProjectMember"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"projectId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"userId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"removeProjectMember"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"projectId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"projectId"}}},{"kind":"Argument","name":{"kind":"Name","value":"userId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"userId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"CommandResultFields"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"CommandResultFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"CommandResult"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"key"}},{"kind":"Field","name":{"kind":"Name","value":"version"}}]}}]} as unknown as DocumentNode; -export const SearchUsersDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"SearchUsers"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"search"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"users"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"search"},"value":{"kind":"Variable","name":{"kind":"Name","value":"search"}}},{"kind":"Argument","name":{"kind":"Name","value":"limit"},"value":{"kind":"IntValue","value":"20"}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"email"}}]}}]}}]} as unknown as DocumentNode; -export const UpdateProjectSettingsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"UpdateProjectSettings"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"projectId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"settings"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ProjectSettingsInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"updateProjectSettings"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"projectId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"projectId"}}},{"kind":"Argument","name":{"kind":"Name","value":"settings"},"value":{"kind":"Variable","name":{"kind":"Name","value":"settings"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"CommandResultFields"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"CommandResultFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"CommandResult"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"key"}},{"kind":"Field","name":{"kind":"Name","value":"version"}}]}}]} as unknown as DocumentNode; -export const ProjectAnalyticsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"ProjectAnalytics"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"idOrKey"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"days"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"Int"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"project"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"idOrKey"},"value":{"kind":"Variable","name":{"kind":"Name","value":"idOrKey"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"analytics"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"days"},"value":{"kind":"Variable","name":{"kind":"Name","value":"days"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"from"}},{"kind":"Field","name":{"kind":"Name","value":"to"}},{"kind":"Field","name":{"kind":"Name","value":"createdVsResolved"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"week"}},{"kind":"Field","name":{"kind":"Name","value":"created"}},{"kind":"Field","name":{"kind":"Name","value":"resolved"}}]}},{"kind":"Field","name":{"kind":"Name","value":"cumulativeFlow"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"dates"}},{"kind":"Field","name":{"kind":"Name","value":"series"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"status"}},{"kind":"Field","name":{"kind":"Name","value":"counts"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"cycleTime"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"count"}},{"kind":"Field","name":{"kind":"Name","value":"averageDays"}},{"kind":"Field","name":{"kind":"Name","value":"p85Days"}}]}},{"kind":"Field","name":{"kind":"Name","value":"leadTime"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"count"}},{"kind":"Field","name":{"kind":"Name","value":"averageDays"}},{"kind":"Field","name":{"kind":"Name","value":"p85Days"}}]}},{"kind":"Field","name":{"kind":"Name","value":"throughput"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"week"}},{"kind":"Field","name":{"kind":"Name","value":"count"}},{"kind":"Field","name":{"kind":"Name","value":"user"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"UserRefFields"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"qa"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"passed"}},{"kind":"Field","name":{"kind":"Name","value":"failed"}},{"kind":"Field","name":{"kind":"Name","value":"failureRate"}}]}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"UserRefFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"UserRef"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}}]} as unknown as DocumentNode; -export const PublicProjectsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"PublicProjects"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"publicProjects"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"ProjectFields"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"UserRefFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"UserRef"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ProjectFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Project"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"key"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"isPublic"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"version"}},{"kind":"Field","name":{"kind":"Name","value":"owner"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"UserRefFields"}}]}},{"kind":"Field","name":{"kind":"Name","value":"members"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"role"}},{"kind":"Field","name":{"kind":"Name","value":"user"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"UserRefFields"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"settings"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"statuses"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"category"}},{"kind":"Field","name":{"kind":"Name","value":"color"}},{"kind":"Field","name":{"kind":"Name","value":"requiresReason"}},{"kind":"Field","name":{"kind":"Name","value":"archived"}},{"kind":"Field","name":{"kind":"Name","value":"wipLimit"}}]}},{"kind":"Field","name":{"kind":"Name","value":"transitions"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"from"}},{"kind":"Field","name":{"kind":"Name","value":"to"}}]}},{"kind":"Field","name":{"kind":"Name","value":"issueTypes"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"icon"}},{"kind":"Field","name":{"kind":"Name","value":"color"}},{"kind":"Field","name":{"kind":"Name","value":"archived"}},{"kind":"Field","name":{"kind":"Name","value":"template"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"checklist"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"areas"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"archived"}}]}}]}}]}}]} as unknown as DocumentNode; -export const UpdateProjectDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"UpdateProject"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"UpdateProjectInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"updateProject"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"CommandResultFields"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"CommandResultFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"CommandResult"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"key"}},{"kind":"Field","name":{"kind":"Name","value":"version"}}]}}]} as unknown as DocumentNode; -export const DeleteProjectDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"DeleteProject"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"projectId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"confirmKey"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"deleteProject"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"projectId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"projectId"}}},{"kind":"Argument","name":{"kind":"Name","value":"confirmKey"},"value":{"kind":"Variable","name":{"kind":"Name","value":"confirmKey"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"CommandResultFields"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"CommandResultFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"CommandResult"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"key"}},{"kind":"Field","name":{"kind":"Name","value":"version"}}]}}]} as unknown as DocumentNode; -export const ReleasesDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"Releases"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"idOrKey"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"project"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"idOrKey"},"value":{"kind":"Variable","name":{"kind":"Name","value":"idOrKey"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"releases"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"ReleaseFields"}},{"kind":"Field","name":{"kind":"Name","value":"progress"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"total"}},{"kind":"Field","name":{"kind":"Name","value":"finished"}},{"kind":"Field","name":{"kind":"Name","value":"percent"}}]}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ReleaseFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Release"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"projectId"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"targetDate"}},{"kind":"Field","name":{"kind":"Name","value":"status"}},{"kind":"Field","name":{"kind":"Name","value":"releasedAt"}},{"kind":"Field","name":{"kind":"Name","value":"notes"}}]}}]} as unknown as DocumentNode; -export const CreateReleaseDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"CreateRelease"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"CreateReleaseInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"createRelease"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"CommandResultFields"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"CommandResultFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"CommandResult"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"key"}},{"kind":"Field","name":{"kind":"Name","value":"version"}}]}}]} as unknown as DocumentNode; -export const PublishReleaseDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"PublishRelease"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"releaseId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"force"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"Boolean"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"publishRelease"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"releaseId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"releaseId"}}},{"kind":"Argument","name":{"kind":"Name","value":"force"},"value":{"kind":"Variable","name":{"kind":"Name","value":"force"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"CommandResultFields"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"CommandResultFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"CommandResult"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"key"}},{"kind":"Field","name":{"kind":"Name","value":"version"}}]}}]} as unknown as DocumentNode; -export const ArchiveReleaseDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"ArchiveRelease"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"releaseId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"archiveRelease"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"releaseId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"releaseId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"CommandResultFields"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"CommandResultFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"CommandResult"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"key"}},{"kind":"Field","name":{"kind":"Name","value":"version"}}]}}]} as unknown as DocumentNode; -export const ActivityDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"Activity"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"projectId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"issueId"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"activity"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"projectId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"projectId"}}},{"kind":"Argument","name":{"kind":"Name","value":"issueId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"issueId"}}},{"kind":"Argument","name":{"kind":"Name","value":"limit"},"value":{"kind":"IntValue","value":"100"}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"ActivityFields"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"UserRefFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"UserRef"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ActivityFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Activity"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"type"}},{"kind":"Field","name":{"kind":"Name","value":"issueId"}},{"kind":"Field","name":{"kind":"Name","value":"issueKey"}},{"kind":"Field","name":{"kind":"Name","value":"summary"}},{"kind":"Field","name":{"kind":"Name","value":"occurredAt"}},{"kind":"Field","name":{"kind":"Name","value":"actor"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"UserRefFields"}}]}}]}}]} as unknown as DocumentNode; -export const UpcomingReleasesDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"UpcomingReleases"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"limit"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"Int"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"upcomingReleases"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"limit"},"value":{"kind":"Variable","name":{"kind":"Name","value":"limit"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"ReleaseFields"}},{"kind":"Field","name":{"kind":"Name","value":"progress"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"total"}},{"kind":"Field","name":{"kind":"Name","value":"finished"}},{"kind":"Field","name":{"kind":"Name","value":"percent"}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ReleaseFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Release"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"projectId"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"targetDate"}},{"kind":"Field","name":{"kind":"Name","value":"status"}},{"kind":"Field","name":{"kind":"Name","value":"releasedAt"}},{"kind":"Field","name":{"kind":"Name","value":"notes"}}]}}]} as unknown as DocumentNode; -export const ReleaseBurnupDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"ReleaseBurnup"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"id"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"release"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"id"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"burnup"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"releaseId"}},{"kind":"Field","name":{"kind":"Name","value":"targetDate"}},{"kind":"Field","name":{"kind":"Name","value":"dates"}},{"kind":"Field","name":{"kind":"Name","value":"scope"}},{"kind":"Field","name":{"kind":"Name","value":"done"}}]}}]}}]}}]} as unknown as DocumentNode; -export const ReleaseNotesDraftDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"ReleaseNotesDraft"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"id"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"release"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"id"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"notesDraft"}}]}}]}}]} as unknown as DocumentNode; -export const WriteReleaseNotesDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"WriteReleaseNotes"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"releaseId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"notes"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"writeReleaseNotes"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"releaseId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"releaseId"}}},{"kind":"Argument","name":{"kind":"Name","value":"notes"},"value":{"kind":"Variable","name":{"kind":"Name","value":"notes"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"CommandResultFields"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"CommandResultFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"CommandResult"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"key"}},{"kind":"Field","name":{"kind":"Name","value":"version"}}]}}]} as unknown as DocumentNode; -export const SavedFiltersDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"SavedFilters"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"projectId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"savedFilters"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"projectId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"projectId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"SavedFilterFields"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"UserRefFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"UserRef"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"SavedFilterFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"SavedFilter"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"projectId"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"shared"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"owner"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"UserRefFields"}}]}},{"kind":"Field","name":{"kind":"Name","value":"criteria"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"types"}},{"kind":"Field","name":{"kind":"Name","value":"areas"}},{"kind":"Field","name":{"kind":"Name","value":"priorities"}},{"kind":"Field","name":{"kind":"Name","value":"assigneeId"}},{"kind":"Field","name":{"kind":"Name","value":"unassigned"}},{"kind":"Field","name":{"kind":"Name","value":"releaseId"}},{"kind":"Field","name":{"kind":"Name","value":"labels"}},{"kind":"Field","name":{"kind":"Name","value":"search"}}]}}]}}]} as unknown as DocumentNode; -export const SaveFilterDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"SaveFilter"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"SaveFilterInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"saveFilter"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}]}]}}]} as unknown as DocumentNode; -export const DeleteSavedFilterDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"DeleteSavedFilter"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"id"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"deleteSavedFilter"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"id"}}}]}]}}]} as unknown as DocumentNode; -export const SprintsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"Sprints"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"projectId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"sprints"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"projectId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"projectId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"SprintFields"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"SprintFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Sprint"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"projectId"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"goal"}},{"kind":"Field","name":{"kind":"Name","value":"startDate"}},{"kind":"Field","name":{"kind":"Name","value":"endDate"}},{"kind":"Field","name":{"kind":"Name","value":"status"}},{"kind":"Field","name":{"kind":"Name","value":"startedAt"}},{"kind":"Field","name":{"kind":"Name","value":"closedAt"}},{"kind":"Field","name":{"kind":"Name","value":"progress"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"total"}},{"kind":"Field","name":{"kind":"Name","value":"finished"}},{"kind":"Field","name":{"kind":"Name","value":"percent"}},{"kind":"Field","name":{"kind":"Name","value":"storyPoints"}},{"kind":"Field","name":{"kind":"Name","value":"finishedStoryPoints"}}]}}]}}]} as unknown as DocumentNode; -export const SprintBurndownDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"SprintBurndown"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"id"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"sprint"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"id"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"burndown"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"sprintId"}},{"kind":"Field","name":{"kind":"Name","value":"dates"}},{"kind":"Field","name":{"kind":"Name","value":"scope"}},{"kind":"Field","name":{"kind":"Name","value":"remaining"}},{"kind":"Field","name":{"kind":"Name","value":"remainingPoints"}},{"kind":"Field","name":{"kind":"Name","value":"ideal"}}]}}]}}]}}]} as unknown as DocumentNode; -export const CreateSprintDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"CreateSprint"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"CreateSprintInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"createSprint"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"CommandResultFields"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"CommandResultFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"CommandResult"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"key"}},{"kind":"Field","name":{"kind":"Name","value":"version"}}]}}]} as unknown as DocumentNode; -export const UpdateSprintDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"UpdateSprint"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"UpdateSprintInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"updateSprint"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"CommandResultFields"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"CommandResultFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"CommandResult"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"key"}},{"kind":"Field","name":{"kind":"Name","value":"version"}}]}}]} as unknown as DocumentNode; -export const StartSprintDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"StartSprint"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"sprintId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"startSprint"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"sprintId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"sprintId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"CommandResultFields"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"CommandResultFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"CommandResult"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"key"}},{"kind":"Field","name":{"kind":"Name","value":"version"}}]}}]} as unknown as DocumentNode; -export const CloseSprintDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"CloseSprint"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"sprintId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"carryOverToSprintId"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"closeSprint"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"sprintId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"sprintId"}}},{"kind":"Argument","name":{"kind":"Name","value":"carryOverToSprintId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"carryOverToSprintId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"CommandResultFields"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"CommandResultFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"CommandResult"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"key"}},{"kind":"Field","name":{"kind":"Name","value":"version"}}]}}]} as unknown as DocumentNode; -export const DeleteSprintDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"DeleteSprint"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"sprintId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"deleteSprint"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"sprintId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"sprintId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"CommandResultFields"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"CommandResultFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"CommandResult"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"key"}},{"kind":"Field","name":{"kind":"Name","value":"version"}}]}}]} as unknown as DocumentNode; -export const SetIssueSprintDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"SetIssueSprint"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"issueId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"sprintId"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"setIssueSprint"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"issueId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"issueId"}}},{"kind":"Argument","name":{"kind":"Name","value":"sprintId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"sprintId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"CommandResultFields"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"CommandResultFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"CommandResult"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"key"}},{"kind":"Field","name":{"kind":"Name","value":"version"}}]}}]} as unknown as DocumentNode; -export const SprintChangedDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"subscription","name":{"kind":"Name","value":"SprintChanged"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"projectId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"sprintChanged"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"projectId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"projectId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"action"}},{"kind":"Field","name":{"kind":"Name","value":"sprintId"}}]}}]}}]} as unknown as DocumentNode; -export const IssueChangedDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"subscription","name":{"kind":"Name","value":"IssueChanged"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"projectId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"issueChanged"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"projectId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"projectId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"action"}},{"kind":"Field","name":{"kind":"Name","value":"version"}},{"kind":"Field","name":{"kind":"Name","value":"actorId"}},{"kind":"Field","name":{"kind":"Name","value":"issue"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"IssueSummaryFields"}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"UserRefFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"UserRef"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"IssueSummaryFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Issue"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"projectId"}},{"kind":"Field","name":{"kind":"Name","value":"key"}},{"kind":"Field","name":{"kind":"Name","value":"type"}},{"kind":"Field","name":{"kind":"Name","value":"area"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"status"}},{"kind":"Field","name":{"kind":"Name","value":"statusCategory"}},{"kind":"Field","name":{"kind":"Name","value":"priority"}},{"kind":"Field","name":{"kind":"Name","value":"labels"}},{"kind":"Field","name":{"kind":"Name","value":"commentCount"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"version"}},{"kind":"Field","name":{"kind":"Name","value":"assignee"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"UserRefFields"}}]}},{"kind":"Field","name":{"kind":"Name","value":"release"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"Field","name":{"kind":"Name","value":"sprint"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"Field","name":{"kind":"Name","value":"parent"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"key"}},{"kind":"Field","name":{"kind":"Name","value":"title"}}]}},{"kind":"Field","name":{"kind":"Name","value":"rank"}},{"kind":"Field","name":{"kind":"Name","value":"storyPoints"}},{"kind":"Field","name":{"kind":"Name","value":"startDate"}},{"kind":"Field","name":{"kind":"Name","value":"dueDate"}},{"kind":"Field","name":{"kind":"Name","value":"trashedAt"}}]}}]} as unknown as DocumentNode; -export const CommentChangedDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"subscription","name":{"kind":"Name","value":"CommentChanged"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"issueId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"commentChanged"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"issueId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"issueId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"action"}},{"kind":"Field","name":{"kind":"Name","value":"commentId"}},{"kind":"Field","name":{"kind":"Name","value":"comment"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"CommentFields"}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"UserRefFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"UserRef"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"CommentFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Comment"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"issueId"}},{"kind":"Field","name":{"kind":"Name","value":"body"}},{"kind":"Field","name":{"kind":"Name","value":"replyTo"}},{"kind":"Field","name":{"kind":"Name","value":"deleted"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"editedAt"}},{"kind":"Field","name":{"kind":"Name","value":"author"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"UserRefFields"}}]}}]}}]} as unknown as DocumentNode; -export const ActivityAddedDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"subscription","name":{"kind":"Name","value":"ActivityAdded"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"projectId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"activityAdded"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"projectId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"projectId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"ActivityFields"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"UserRefFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"UserRef"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ActivityFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Activity"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"type"}},{"kind":"Field","name":{"kind":"Name","value":"issueId"}},{"kind":"Field","name":{"kind":"Name","value":"issueKey"}},{"kind":"Field","name":{"kind":"Name","value":"summary"}},{"kind":"Field","name":{"kind":"Name","value":"occurredAt"}},{"kind":"Field","name":{"kind":"Name","value":"actor"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"UserRefFields"}}]}}]}}]} as unknown as DocumentNode; -export const ReleaseChangedDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"subscription","name":{"kind":"Name","value":"ReleaseChanged"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"projectId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"releaseChanged"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"projectId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"projectId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"release"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"ReleaseFields"}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ReleaseFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Release"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"projectId"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"targetDate"}},{"kind":"Field","name":{"kind":"Name","value":"status"}},{"kind":"Field","name":{"kind":"Name","value":"releasedAt"}},{"kind":"Field","name":{"kind":"Name","value":"notes"}}]}}]} as unknown as DocumentNode; -export const ProjectChangedDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"subscription","name":{"kind":"Name","value":"ProjectChanged"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"projectId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"projectChanged"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"projectId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"projectId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"action"}},{"kind":"Field","name":{"kind":"Name","value":"project"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"ProjectFields"}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"UserRefFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"UserRef"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ProjectFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Project"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"key"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"isPublic"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"version"}},{"kind":"Field","name":{"kind":"Name","value":"owner"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"UserRefFields"}}]}},{"kind":"Field","name":{"kind":"Name","value":"members"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"role"}},{"kind":"Field","name":{"kind":"Name","value":"user"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"UserRefFields"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"settings"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"statuses"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"category"}},{"kind":"Field","name":{"kind":"Name","value":"color"}},{"kind":"Field","name":{"kind":"Name","value":"requiresReason"}},{"kind":"Field","name":{"kind":"Name","value":"archived"}},{"kind":"Field","name":{"kind":"Name","value":"wipLimit"}}]}},{"kind":"Field","name":{"kind":"Name","value":"transitions"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"from"}},{"kind":"Field","name":{"kind":"Name","value":"to"}}]}},{"kind":"Field","name":{"kind":"Name","value":"issueTypes"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"icon"}},{"kind":"Field","name":{"kind":"Name","value":"color"}},{"kind":"Field","name":{"kind":"Name","value":"archived"}},{"kind":"Field","name":{"kind":"Name","value":"template"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"checklist"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"areas"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"archived"}}]}}]}}]}}]} as unknown as DocumentNode; -export const MyProjectsChangedDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"subscription","name":{"kind":"Name","value":"MyProjectsChanged"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"myProjectsChanged"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"action"}},{"kind":"Field","name":{"kind":"Name","value":"project"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"ProjectFields"}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"UserRefFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"UserRef"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ProjectFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Project"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"key"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"isPublic"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"version"}},{"kind":"Field","name":{"kind":"Name","value":"owner"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"UserRefFields"}}]}},{"kind":"Field","name":{"kind":"Name","value":"members"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"role"}},{"kind":"Field","name":{"kind":"Name","value":"user"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"UserRefFields"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"settings"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"statuses"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"category"}},{"kind":"Field","name":{"kind":"Name","value":"color"}},{"kind":"Field","name":{"kind":"Name","value":"requiresReason"}},{"kind":"Field","name":{"kind":"Name","value":"archived"}},{"kind":"Field","name":{"kind":"Name","value":"wipLimit"}}]}},{"kind":"Field","name":{"kind":"Name","value":"transitions"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"from"}},{"kind":"Field","name":{"kind":"Name","value":"to"}}]}},{"kind":"Field","name":{"kind":"Name","value":"issueTypes"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"icon"}},{"kind":"Field","name":{"kind":"Name","value":"color"}},{"kind":"Field","name":{"kind":"Name","value":"archived"}},{"kind":"Field","name":{"kind":"Name","value":"template"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"checklist"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"areas"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"archived"}}]}}]}}]}}]} as unknown as DocumentNode; -export const WebhooksDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"Webhooks"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"projectId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"webhooks"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"projectId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"projectId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WebhookFields"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"UserRefFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"UserRef"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"WebhookDeliveryFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"WebhookDelivery"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"at"}},{"kind":"Field","name":{"kind":"Name","value":"event"}},{"kind":"Field","name":{"kind":"Name","value":"status"}},{"kind":"Field","name":{"kind":"Name","value":"ok"}},{"kind":"Field","name":{"kind":"Name","value":"error"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"WebhookFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Webhook"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"url"}},{"kind":"Field","name":{"kind":"Name","value":"events"}},{"kind":"Field","name":{"kind":"Name","value":"active"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"createdBy"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"UserRefFields"}}]}},{"kind":"Field","name":{"kind":"Name","value":"lastDelivery"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WebhookDeliveryFields"}}]}}]}}]} as unknown as DocumentNode; -export const WebhookEventsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"WebhookEvents"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"webhookEvents"}}]}}]} as unknown as DocumentNode; -export const CreateWebhookDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"CreateWebhook"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"CreateWebhookInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"createWebhook"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"secret"}}]}}]}}]} as unknown as DocumentNode; -export const UpdateWebhookDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"UpdateWebhook"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"UpdateWebhookInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"updateWebhook"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WebhookFields"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"UserRefFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"UserRef"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"WebhookDeliveryFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"WebhookDelivery"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"at"}},{"kind":"Field","name":{"kind":"Name","value":"event"}},{"kind":"Field","name":{"kind":"Name","value":"status"}},{"kind":"Field","name":{"kind":"Name","value":"ok"}},{"kind":"Field","name":{"kind":"Name","value":"error"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"WebhookFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Webhook"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"url"}},{"kind":"Field","name":{"kind":"Name","value":"events"}},{"kind":"Field","name":{"kind":"Name","value":"active"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"createdBy"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"UserRefFields"}}]}},{"kind":"Field","name":{"kind":"Name","value":"lastDelivery"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WebhookDeliveryFields"}}]}}]}}]} as unknown as DocumentNode; -export const DeleteWebhookDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"DeleteWebhook"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"webhookId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"deleteWebhook"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"webhookId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"webhookId"}}}]}]}}]} as unknown as DocumentNode; -export const TestWebhookDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"TestWebhook"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"webhookId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"testWebhook"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"webhookId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"webhookId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WebhookDeliveryFields"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"WebhookDeliveryFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"WebhookDelivery"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"at"}},{"kind":"Field","name":{"kind":"Name","value":"event"}},{"kind":"Field","name":{"kind":"Name","value":"status"}},{"kind":"Field","name":{"kind":"Name","value":"ok"}},{"kind":"Field","name":{"kind":"Name","value":"error"}}]}}]} as unknown as DocumentNode; \ No newline at end of file +export const UserRefFieldsFragmentDoc = { + kind: 'Document', + definitions: [ + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'UserRefFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'UserRef' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, + ], + }, + }, + ], +} as unknown as DocumentNode; +export const AutomationFieldsFragmentDoc = { + kind: 'Document', + definitions: [ + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'AutomationFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'Automation' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, + { kind: 'Field', name: { kind: 'Name', value: 'active' } }, + { kind: 'Field', name: { kind: 'Name', value: 'runs' } }, + { kind: 'Field', name: { kind: 'Name', value: 'lastRunAt' } }, + { kind: 'Field', name: { kind: 'Name', value: 'lastError' } }, + { + kind: 'Field', + name: { kind: 'Name', value: 'trigger' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'kind' } }, + { kind: 'Field', name: { kind: 'Name', value: 'status' } }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'conditions' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'types' } }, + { kind: 'Field', name: { kind: 'Name', value: 'priorities' } }, + { kind: 'Field', name: { kind: 'Name', value: 'areas' } }, + { kind: 'Field', name: { kind: 'Name', value: 'label' } }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'action' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'kind' } }, + { kind: 'Field', name: { kind: 'Name', value: 'value' } }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'createdBy' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'UserRefFields' }, + }, + ], + }, + }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'UserRefFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'UserRef' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, + ], + }, + }, + ], +} as unknown as DocumentNode; +export const ProjectFieldsFragmentDoc = { + kind: 'Document', + definitions: [ + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'ProjectFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'Project' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'key' } }, + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, + { kind: 'Field', name: { kind: 'Name', value: 'description' } }, + { kind: 'Field', name: { kind: 'Name', value: 'isPublic' } }, + { kind: 'Field', name: { kind: 'Name', value: 'acceptsProposals' } }, + { kind: 'Field', name: { kind: 'Name', value: 'updatedAt' } }, + { kind: 'Field', name: { kind: 'Name', value: 'version' } }, + { + kind: 'Field', + name: { kind: 'Name', value: 'owner' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'UserRefFields' }, + }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'members' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'role' } }, + { + kind: 'Field', + name: { kind: 'Name', value: 'user' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'UserRefFields' }, + }, + ], + }, + }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'settings' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'statuses' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, + { + kind: 'Field', + name: { kind: 'Name', value: 'category' }, + }, + { kind: 'Field', name: { kind: 'Name', value: 'color' } }, + { + kind: 'Field', + name: { kind: 'Name', value: 'requiresReason' }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'archived' }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'wipLimit' }, + }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'transitions' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'from' } }, + { kind: 'Field', name: { kind: 'Name', value: 'to' } }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'issueTypes' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, + { kind: 'Field', name: { kind: 'Name', value: 'icon' } }, + { kind: 'Field', name: { kind: 'Name', value: 'color' } }, + { + kind: 'Field', + name: { kind: 'Name', value: 'archived' }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'template' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'description' }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'checklist' }, + }, + ], + }, + }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'areas' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, + { + kind: 'Field', + name: { kind: 'Name', value: 'archived' }, + }, + ], + }, + }, + ], + }, + }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'UserRefFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'UserRef' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, + ], + }, + }, + ], +} as unknown as DocumentNode; +export const IssueSummaryFieldsFragmentDoc = { + kind: 'Document', + definitions: [ + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'IssueSummaryFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'Issue' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'projectId' } }, + { kind: 'Field', name: { kind: 'Name', value: 'key' } }, + { kind: 'Field', name: { kind: 'Name', value: 'type' } }, + { kind: 'Field', name: { kind: 'Name', value: 'area' } }, + { kind: 'Field', name: { kind: 'Name', value: 'title' } }, + { kind: 'Field', name: { kind: 'Name', value: 'status' } }, + { kind: 'Field', name: { kind: 'Name', value: 'statusCategory' } }, + { kind: 'Field', name: { kind: 'Name', value: 'priority' } }, + { kind: 'Field', name: { kind: 'Name', value: 'labels' } }, + { kind: 'Field', name: { kind: 'Name', value: 'commentCount' } }, + { kind: 'Field', name: { kind: 'Name', value: 'updatedAt' } }, + { kind: 'Field', name: { kind: 'Name', value: 'version' } }, + { + kind: 'Field', + name: { kind: 'Name', value: 'assignee' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'UserRefFields' }, + }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'release' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'sprint' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'parent' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'key' } }, + { kind: 'Field', name: { kind: 'Name', value: 'title' } }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'blockedBy' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'key' } }, + { kind: 'Field', name: { kind: 'Name', value: 'title' } }, + ], + }, + }, + { kind: 'Field', name: { kind: 'Name', value: 'votes' } }, + { kind: 'Field', name: { kind: 'Name', value: 'voted' } }, + { kind: 'Field', name: { kind: 'Name', value: 'rank' } }, + { kind: 'Field', name: { kind: 'Name', value: 'storyPoints' } }, + { kind: 'Field', name: { kind: 'Name', value: 'startDate' } }, + { kind: 'Field', name: { kind: 'Name', value: 'dueDate' } }, + { kind: 'Field', name: { kind: 'Name', value: 'trashedAt' } }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'UserRefFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'UserRef' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, + ], + }, + }, + ], +} as unknown as DocumentNode; +export const IssueFieldsFragmentDoc = { + kind: 'Document', + definitions: [ + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'IssueFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'Issue' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'IssueSummaryFields' }, + }, + { kind: 'Field', name: { kind: 'Name', value: 'description' } }, + { kind: 'Field', name: { kind: 'Name', value: 'figmaUrl' } }, + { kind: 'Field', name: { kind: 'Name', value: 'createdAt' } }, + { + kind: 'Field', + name: { kind: 'Name', value: 'allowedTransitions' }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'reporter' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'UserRefFields' }, + }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'links' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'type' } }, + { kind: 'Field', name: { kind: 'Name', value: 'direction' } }, + { kind: 'Field', name: { kind: 'Name', value: 'issueId' } }, + { kind: 'Field', name: { kind: 'Name', value: 'issueKey' } }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'watchers' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'UserRefFields' }, + }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'checklist' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'text' } }, + { kind: 'Field', name: { kind: 'Name', value: 'done' } }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'devLinks' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'kind' } }, + { kind: 'Field', name: { kind: 'Name', value: 'url' } }, + { kind: 'Field', name: { kind: 'Name', value: 'title' } }, + { kind: 'Field', name: { kind: 'Name', value: 'ref' } }, + { kind: 'Field', name: { kind: 'Name', value: 'state' } }, + { kind: 'Field', name: { kind: 'Name', value: 'provider' } }, + { kind: 'Field', name: { kind: 'Name', value: 'repository' } }, + { kind: 'Field', name: { kind: 'Name', value: 'author' } }, + { kind: 'Field', name: { kind: 'Name', value: 'at' } }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'attachments' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'fileName' } }, + { kind: 'Field', name: { kind: 'Name', value: 'mimeType' } }, + { kind: 'Field', name: { kind: 'Name', value: 'size' } }, + { kind: 'Field', name: { kind: 'Name', value: 'uploadedAt' } }, + { kind: 'Field', name: { kind: 'Name', value: 'commentId' } }, + { + kind: 'Field', + name: { kind: 'Name', value: 'uploadedBy' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'UserRefFields' }, + }, + ], + }, + }, + ], + }, + }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'UserRefFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'UserRef' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'IssueSummaryFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'Issue' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'projectId' } }, + { kind: 'Field', name: { kind: 'Name', value: 'key' } }, + { kind: 'Field', name: { kind: 'Name', value: 'type' } }, + { kind: 'Field', name: { kind: 'Name', value: 'area' } }, + { kind: 'Field', name: { kind: 'Name', value: 'title' } }, + { kind: 'Field', name: { kind: 'Name', value: 'status' } }, + { kind: 'Field', name: { kind: 'Name', value: 'statusCategory' } }, + { kind: 'Field', name: { kind: 'Name', value: 'priority' } }, + { kind: 'Field', name: { kind: 'Name', value: 'labels' } }, + { kind: 'Field', name: { kind: 'Name', value: 'commentCount' } }, + { kind: 'Field', name: { kind: 'Name', value: 'updatedAt' } }, + { kind: 'Field', name: { kind: 'Name', value: 'version' } }, + { + kind: 'Field', + name: { kind: 'Name', value: 'assignee' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'UserRefFields' }, + }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'release' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'sprint' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'parent' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'key' } }, + { kind: 'Field', name: { kind: 'Name', value: 'title' } }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'blockedBy' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'key' } }, + { kind: 'Field', name: { kind: 'Name', value: 'title' } }, + ], + }, + }, + { kind: 'Field', name: { kind: 'Name', value: 'votes' } }, + { kind: 'Field', name: { kind: 'Name', value: 'voted' } }, + { kind: 'Field', name: { kind: 'Name', value: 'rank' } }, + { kind: 'Field', name: { kind: 'Name', value: 'storyPoints' } }, + { kind: 'Field', name: { kind: 'Name', value: 'startDate' } }, + { kind: 'Field', name: { kind: 'Name', value: 'dueDate' } }, + { kind: 'Field', name: { kind: 'Name', value: 'trashedAt' } }, + ], + }, + }, + ], +} as unknown as DocumentNode; +export const CommentFieldsFragmentDoc = { + kind: 'Document', + definitions: [ + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'CommentFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'Comment' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'issueId' } }, + { kind: 'Field', name: { kind: 'Name', value: 'body' } }, + { kind: 'Field', name: { kind: 'Name', value: 'replyTo' } }, + { kind: 'Field', name: { kind: 'Name', value: 'deleted' } }, + { + kind: 'Field', + name: { kind: 'Name', value: 'reactions' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'emoji' } }, + { + kind: 'Field', + name: { kind: 'Name', value: 'users' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'UserRefFields' }, + }, + ], + }, + }, + ], + }, + }, + { kind: 'Field', name: { kind: 'Name', value: 'createdAt' } }, + { kind: 'Field', name: { kind: 'Name', value: 'editedAt' } }, + { + kind: 'Field', + name: { kind: 'Name', value: 'author' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'UserRefFields' }, + }, + ], + }, + }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'UserRefFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'UserRef' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, + ], + }, + }, + ], +} as unknown as DocumentNode; +export const ReleaseFieldsFragmentDoc = { + kind: 'Document', + definitions: [ + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'ReleaseFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'Release' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'projectId' } }, + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, + { kind: 'Field', name: { kind: 'Name', value: 'description' } }, + { kind: 'Field', name: { kind: 'Name', value: 'targetDate' } }, + { kind: 'Field', name: { kind: 'Name', value: 'status' } }, + { kind: 'Field', name: { kind: 'Name', value: 'releasedAt' } }, + { kind: 'Field', name: { kind: 'Name', value: 'notes' } }, + ], + }, + }, + ], +} as unknown as DocumentNode; +export const ActivityFieldsFragmentDoc = { + kind: 'Document', + definitions: [ + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'ActivityFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'Activity' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'type' } }, + { kind: 'Field', name: { kind: 'Name', value: 'issueId' } }, + { kind: 'Field', name: { kind: 'Name', value: 'issueKey' } }, + { kind: 'Field', name: { kind: 'Name', value: 'summary' } }, + { kind: 'Field', name: { kind: 'Name', value: 'occurredAt' } }, + { + kind: 'Field', + name: { kind: 'Name', value: 'actor' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'UserRefFields' }, + }, + ], + }, + }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'UserRefFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'UserRef' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, + ], + }, + }, + ], +} as unknown as DocumentNode; +export const CommandResultFieldsFragmentDoc = { + kind: 'Document', + definitions: [ + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'CommandResultFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'CommandResult' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'key' } }, + { kind: 'Field', name: { kind: 'Name', value: 'version' } }, + ], + }, + }, + ], +} as unknown as DocumentNode; +export const GitRepositoryFieldsFragmentDoc = { + kind: 'Document', + definitions: [ + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'GitRepositoryFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'GitRepository' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, + { kind: 'Field', name: { kind: 'Name', value: 'secret' } }, + { kind: 'Field', name: { kind: 'Name', value: 'createdAt' } }, + ], + }, + }, + ], +} as unknown as DocumentNode; +export const NotificationFieldsFragmentDoc = { + kind: 'Document', + definitions: [ + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'NotificationFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'Notification' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'kind' } }, + { kind: 'Field', name: { kind: 'Name', value: 'projectId' } }, + { kind: 'Field', name: { kind: 'Name', value: 'projectKey' } }, + { kind: 'Field', name: { kind: 'Name', value: 'issueId' } }, + { kind: 'Field', name: { kind: 'Name', value: 'issueKey' } }, + { kind: 'Field', name: { kind: 'Name', value: 'summary' } }, + { kind: 'Field', name: { kind: 'Name', value: 'readAt' } }, + { kind: 'Field', name: { kind: 'Name', value: 'createdAt' } }, + { + kind: 'Field', + name: { kind: 'Name', value: 'actor' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'UserRefFields' }, + }, + ], + }, + }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'UserRefFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'UserRef' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, + ], + }, + }, + ], +} as unknown as DocumentNode; +export const SavedFilterFieldsFragmentDoc = { + kind: 'Document', + definitions: [ + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'SavedFilterFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'SavedFilter' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'projectId' } }, + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, + { kind: 'Field', name: { kind: 'Name', value: 'shared' } }, + { kind: 'Field', name: { kind: 'Name', value: 'createdAt' } }, + { + kind: 'Field', + name: { kind: 'Name', value: 'owner' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'UserRefFields' }, + }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'criteria' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'types' } }, + { kind: 'Field', name: { kind: 'Name', value: 'areas' } }, + { kind: 'Field', name: { kind: 'Name', value: 'priorities' } }, + { kind: 'Field', name: { kind: 'Name', value: 'assigneeId' } }, + { kind: 'Field', name: { kind: 'Name', value: 'unassigned' } }, + { kind: 'Field', name: { kind: 'Name', value: 'releaseId' } }, + { kind: 'Field', name: { kind: 'Name', value: 'labels' } }, + { kind: 'Field', name: { kind: 'Name', value: 'search' } }, + ], + }, + }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'UserRefFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'UserRef' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, + ], + }, + }, + ], +} as unknown as DocumentNode; +export const SprintFieldsFragmentDoc = { + kind: 'Document', + definitions: [ + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'SprintFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'Sprint' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'projectId' } }, + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, + { kind: 'Field', name: { kind: 'Name', value: 'goal' } }, + { kind: 'Field', name: { kind: 'Name', value: 'startDate' } }, + { kind: 'Field', name: { kind: 'Name', value: 'endDate' } }, + { kind: 'Field', name: { kind: 'Name', value: 'status' } }, + { kind: 'Field', name: { kind: 'Name', value: 'startedAt' } }, + { kind: 'Field', name: { kind: 'Name', value: 'closedAt' } }, + { + kind: 'Field', + name: { kind: 'Name', value: 'progress' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'total' } }, + { kind: 'Field', name: { kind: 'Name', value: 'finished' } }, + { kind: 'Field', name: { kind: 'Name', value: 'percent' } }, + { kind: 'Field', name: { kind: 'Name', value: 'storyPoints' } }, + { + kind: 'Field', + name: { kind: 'Name', value: 'finishedStoryPoints' }, + }, + ], + }, + }, + ], + }, + }, + ], +} as unknown as DocumentNode; +export const WebhookDeliveryFieldsFragmentDoc = { + kind: 'Document', + definitions: [ + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'WebhookDeliveryFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'WebhookDelivery' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'at' } }, + { kind: 'Field', name: { kind: 'Name', value: 'event' } }, + { kind: 'Field', name: { kind: 'Name', value: 'status' } }, + { kind: 'Field', name: { kind: 'Name', value: 'ok' } }, + { kind: 'Field', name: { kind: 'Name', value: 'error' } }, + ], + }, + }, + ], +} as unknown as DocumentNode; +export const WebhookFieldsFragmentDoc = { + kind: 'Document', + definitions: [ + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'WebhookFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'Webhook' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'url' } }, + { kind: 'Field', name: { kind: 'Name', value: 'events' } }, + { kind: 'Field', name: { kind: 'Name', value: 'active' } }, + { kind: 'Field', name: { kind: 'Name', value: 'createdAt' } }, + { + kind: 'Field', + name: { kind: 'Name', value: 'createdBy' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'UserRefFields' }, + }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'lastDelivery' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'WebhookDeliveryFields' }, + }, + ], + }, + }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'UserRefFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'UserRef' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'WebhookDeliveryFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'WebhookDelivery' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'at' } }, + { kind: 'Field', name: { kind: 'Name', value: 'event' } }, + { kind: 'Field', name: { kind: 'Name', value: 'status' } }, + { kind: 'Field', name: { kind: 'Name', value: 'ok' } }, + { kind: 'Field', name: { kind: 'Name', value: 'error' } }, + ], + }, + }, + ], +} as unknown as DocumentNode; +export const AutomationsDocument = { + kind: 'Document', + definitions: [ + { + kind: 'OperationDefinition', + operation: 'query', + name: { kind: 'Name', value: 'Automations' }, + variableDefinitions: [ + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'projectId' }, + }, + type: { + kind: 'NonNullType', + type: { kind: 'NamedType', name: { kind: 'Name', value: 'ID' } }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'automations' }, + arguments: [ + { + kind: 'Argument', + name: { kind: 'Name', value: 'projectId' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'projectId' }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'AutomationFields' }, + }, + ], + }, + }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'UserRefFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'UserRef' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'AutomationFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'Automation' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, + { kind: 'Field', name: { kind: 'Name', value: 'active' } }, + { kind: 'Field', name: { kind: 'Name', value: 'runs' } }, + { kind: 'Field', name: { kind: 'Name', value: 'lastRunAt' } }, + { kind: 'Field', name: { kind: 'Name', value: 'lastError' } }, + { + kind: 'Field', + name: { kind: 'Name', value: 'trigger' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'kind' } }, + { kind: 'Field', name: { kind: 'Name', value: 'status' } }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'conditions' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'types' } }, + { kind: 'Field', name: { kind: 'Name', value: 'priorities' } }, + { kind: 'Field', name: { kind: 'Name', value: 'areas' } }, + { kind: 'Field', name: { kind: 'Name', value: 'label' } }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'action' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'kind' } }, + { kind: 'Field', name: { kind: 'Name', value: 'value' } }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'createdBy' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'UserRefFields' }, + }, + ], + }, + }, + ], + }, + }, + ], +} as unknown as DocumentNode; +export const CreateAutomationDocument = { + kind: 'Document', + definitions: [ + { + kind: 'OperationDefinition', + operation: 'mutation', + name: { kind: 'Name', value: 'CreateAutomation' }, + variableDefinitions: [ + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'input' }, + }, + type: { + kind: 'NonNullType', + type: { + kind: 'NamedType', + name: { kind: 'Name', value: 'CreateAutomationInput' }, + }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'createAutomation' }, + arguments: [ + { + kind: 'Argument', + name: { kind: 'Name', value: 'input' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'input' }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'AutomationFields' }, + }, + ], + }, + }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'UserRefFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'UserRef' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'AutomationFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'Automation' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, + { kind: 'Field', name: { kind: 'Name', value: 'active' } }, + { kind: 'Field', name: { kind: 'Name', value: 'runs' } }, + { kind: 'Field', name: { kind: 'Name', value: 'lastRunAt' } }, + { kind: 'Field', name: { kind: 'Name', value: 'lastError' } }, + { + kind: 'Field', + name: { kind: 'Name', value: 'trigger' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'kind' } }, + { kind: 'Field', name: { kind: 'Name', value: 'status' } }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'conditions' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'types' } }, + { kind: 'Field', name: { kind: 'Name', value: 'priorities' } }, + { kind: 'Field', name: { kind: 'Name', value: 'areas' } }, + { kind: 'Field', name: { kind: 'Name', value: 'label' } }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'action' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'kind' } }, + { kind: 'Field', name: { kind: 'Name', value: 'value' } }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'createdBy' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'UserRefFields' }, + }, + ], + }, + }, + ], + }, + }, + ], +} as unknown as DocumentNode< + CreateAutomationMutation, + CreateAutomationMutationVariables +>; +export const UpdateAutomationDocument = { + kind: 'Document', + definitions: [ + { + kind: 'OperationDefinition', + operation: 'mutation', + name: { kind: 'Name', value: 'UpdateAutomation' }, + variableDefinitions: [ + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'automationId' }, + }, + type: { + kind: 'NonNullType', + type: { kind: 'NamedType', name: { kind: 'Name', value: 'ID' } }, + }, + }, + { + kind: 'VariableDefinition', + variable: { kind: 'Variable', name: { kind: 'Name', value: 'name' } }, + type: { kind: 'NamedType', name: { kind: 'Name', value: 'String' } }, + }, + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'active' }, + }, + type: { kind: 'NamedType', name: { kind: 'Name', value: 'Boolean' } }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'updateAutomation' }, + arguments: [ + { + kind: 'Argument', + name: { kind: 'Name', value: 'automationId' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'automationId' }, + }, + }, + { + kind: 'Argument', + name: { kind: 'Name', value: 'name' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'name' }, + }, + }, + { + kind: 'Argument', + name: { kind: 'Name', value: 'active' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'active' }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'AutomationFields' }, + }, + ], + }, + }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'UserRefFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'UserRef' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'AutomationFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'Automation' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, + { kind: 'Field', name: { kind: 'Name', value: 'active' } }, + { kind: 'Field', name: { kind: 'Name', value: 'runs' } }, + { kind: 'Field', name: { kind: 'Name', value: 'lastRunAt' } }, + { kind: 'Field', name: { kind: 'Name', value: 'lastError' } }, + { + kind: 'Field', + name: { kind: 'Name', value: 'trigger' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'kind' } }, + { kind: 'Field', name: { kind: 'Name', value: 'status' } }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'conditions' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'types' } }, + { kind: 'Field', name: { kind: 'Name', value: 'priorities' } }, + { kind: 'Field', name: { kind: 'Name', value: 'areas' } }, + { kind: 'Field', name: { kind: 'Name', value: 'label' } }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'action' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'kind' } }, + { kind: 'Field', name: { kind: 'Name', value: 'value' } }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'createdBy' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'UserRefFields' }, + }, + ], + }, + }, + ], + }, + }, + ], +} as unknown as DocumentNode< + UpdateAutomationMutation, + UpdateAutomationMutationVariables +>; +export const DeleteAutomationDocument = { + kind: 'Document', + definitions: [ + { + kind: 'OperationDefinition', + operation: 'mutation', + name: { kind: 'Name', value: 'DeleteAutomation' }, + variableDefinitions: [ + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'automationId' }, + }, + type: { + kind: 'NonNullType', + type: { kind: 'NamedType', name: { kind: 'Name', value: 'ID' } }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'deleteAutomation' }, + arguments: [ + { + kind: 'Argument', + name: { kind: 'Name', value: 'automationId' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'automationId' }, + }, + }, + ], + }, + ], + }, + }, + ], +} as unknown as DocumentNode< + DeleteAutomationMutation, + DeleteAutomationMutationVariables +>; +export const GitIntegrationDocument = { + kind: 'Document', + definitions: [ + { + kind: 'OperationDefinition', + operation: 'query', + name: { kind: 'Name', value: 'GitIntegration' }, + variableDefinitions: [ + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'projectId' }, + }, + type: { + kind: 'NonNullType', + type: { kind: 'NamedType', name: { kind: 'Name', value: 'ID' } }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'gitIntegration' }, + arguments: [ + { + kind: 'Argument', + name: { kind: 'Name', value: 'projectId' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'projectId' }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'enabled' } }, + { kind: 'Field', name: { kind: 'Name', value: 'webhookPath' } }, + { + kind: 'Field', + name: { kind: 'Name', value: 'repositories' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'GitRepositoryFields' }, + }, + ], + }, + }, + ], + }, + }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'GitRepositoryFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'GitRepository' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, + { kind: 'Field', name: { kind: 'Name', value: 'secret' } }, + { kind: 'Field', name: { kind: 'Name', value: 'createdAt' } }, + ], + }, + }, + ], +} as unknown as DocumentNode; +export const AddGitRepositoryDocument = { + kind: 'Document', + definitions: [ + { + kind: 'OperationDefinition', + operation: 'mutation', + name: { kind: 'Name', value: 'AddGitRepository' }, + variableDefinitions: [ + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'projectId' }, + }, + type: { + kind: 'NonNullType', + type: { kind: 'NamedType', name: { kind: 'Name', value: 'ID' } }, + }, + }, + { + kind: 'VariableDefinition', + variable: { kind: 'Variable', name: { kind: 'Name', value: 'name' } }, + type: { + kind: 'NonNullType', + type: { + kind: 'NamedType', + name: { kind: 'Name', value: 'String' }, + }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'addGitRepository' }, + arguments: [ + { + kind: 'Argument', + name: { kind: 'Name', value: 'projectId' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'projectId' }, + }, + }, + { + kind: 'Argument', + name: { kind: 'Name', value: 'name' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'name' }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'GitRepositoryFields' }, + }, + ], + }, + }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'GitRepositoryFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'GitRepository' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, + { kind: 'Field', name: { kind: 'Name', value: 'secret' } }, + { kind: 'Field', name: { kind: 'Name', value: 'createdAt' } }, + ], + }, + }, + ], +} as unknown as DocumentNode< + AddGitRepositoryMutation, + AddGitRepositoryMutationVariables +>; +export const RotateGitRepositorySecretDocument = { + kind: 'Document', + definitions: [ + { + kind: 'OperationDefinition', + operation: 'mutation', + name: { kind: 'Name', value: 'RotateGitRepositorySecret' }, + variableDefinitions: [ + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'projectId' }, + }, + type: { + kind: 'NonNullType', + type: { kind: 'NamedType', name: { kind: 'Name', value: 'ID' } }, + }, + }, + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'repositoryId' }, + }, + type: { + kind: 'NonNullType', + type: { kind: 'NamedType', name: { kind: 'Name', value: 'ID' } }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'rotateGitRepositorySecret' }, + arguments: [ + { + kind: 'Argument', + name: { kind: 'Name', value: 'projectId' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'projectId' }, + }, + }, + { + kind: 'Argument', + name: { kind: 'Name', value: 'repositoryId' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'repositoryId' }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'GitRepositoryFields' }, + }, + ], + }, + }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'GitRepositoryFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'GitRepository' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, + { kind: 'Field', name: { kind: 'Name', value: 'secret' } }, + { kind: 'Field', name: { kind: 'Name', value: 'createdAt' } }, + ], + }, + }, + ], +} as unknown as DocumentNode< + RotateGitRepositorySecretMutation, + RotateGitRepositorySecretMutationVariables +>; +export const RemoveGitRepositoryDocument = { + kind: 'Document', + definitions: [ + { + kind: 'OperationDefinition', + operation: 'mutation', + name: { kind: 'Name', value: 'RemoveGitRepository' }, + variableDefinitions: [ + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'projectId' }, + }, + type: { + kind: 'NonNullType', + type: { kind: 'NamedType', name: { kind: 'Name', value: 'ID' } }, + }, + }, + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'repositoryId' }, + }, + type: { + kind: 'NonNullType', + type: { kind: 'NamedType', name: { kind: 'Name', value: 'ID' } }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'removeGitRepository' }, + arguments: [ + { + kind: 'Argument', + name: { kind: 'Name', value: 'projectId' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'projectId' }, + }, + }, + { + kind: 'Argument', + name: { kind: 'Name', value: 'repositoryId' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'repositoryId' }, + }, + }, + ], + }, + ], + }, + }, + ], +} as unknown as DocumentNode< + RemoveGitRepositoryMutation, + RemoveGitRepositoryMutationVariables +>; +export const BoardDocument = { + kind: 'Document', + definitions: [ + { + kind: 'OperationDefinition', + operation: 'query', + name: { kind: 'Name', value: 'Board' }, + variableDefinitions: [ + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'idOrKey' }, + }, + type: { + kind: 'NonNullType', + type: { + kind: 'NamedType', + name: { kind: 'Name', value: 'String' }, + }, + }, + }, + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'releaseId' }, + }, + type: { kind: 'NamedType', name: { kind: 'Name', value: 'ID' } }, + }, + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'assigneeId' }, + }, + type: { kind: 'NamedType', name: { kind: 'Name', value: 'ID' } }, + }, + { + kind: 'VariableDefinition', + variable: { kind: 'Variable', name: { kind: 'Name', value: 'area' } }, + type: { kind: 'NamedType', name: { kind: 'Name', value: 'String' } }, + }, + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'types' }, + }, + type: { + kind: 'ListType', + type: { + kind: 'NonNullType', + type: { + kind: 'NamedType', + name: { kind: 'Name', value: 'String' }, + }, + }, + }, + }, + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'priorities' }, + }, + type: { + kind: 'ListType', + type: { + kind: 'NonNullType', + type: { + kind: 'NamedType', + name: { kind: 'Name', value: 'IssuePriority' }, + }, + }, + }, + }, + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'labels' }, + }, + type: { + kind: 'ListType', + type: { + kind: 'NonNullType', + type: { + kind: 'NamedType', + name: { kind: 'Name', value: 'String' }, + }, + }, + }, + }, + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'search' }, + }, + type: { kind: 'NamedType', name: { kind: 'Name', value: 'String' } }, + }, + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'unassigned' }, + }, + type: { kind: 'NamedType', name: { kind: 'Name', value: 'Boolean' } }, + }, + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'sprintId' }, + }, + type: { kind: 'NamedType', name: { kind: 'Name', value: 'ID' } }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'project' }, + arguments: [ + { + kind: 'Argument', + name: { kind: 'Name', value: 'idOrKey' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'idOrKey' }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { + kind: 'Field', + name: { kind: 'Name', value: 'board' }, + arguments: [ + { + kind: 'Argument', + name: { kind: 'Name', value: 'releaseId' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'releaseId' }, + }, + }, + { + kind: 'Argument', + name: { kind: 'Name', value: 'assigneeId' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'assigneeId' }, + }, + }, + { + kind: 'Argument', + name: { kind: 'Name', value: 'area' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'area' }, + }, + }, + { + kind: 'Argument', + name: { kind: 'Name', value: 'types' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'types' }, + }, + }, + { + kind: 'Argument', + name: { kind: 'Name', value: 'priorities' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'priorities' }, + }, + }, + { + kind: 'Argument', + name: { kind: 'Name', value: 'labels' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'labels' }, + }, + }, + { + kind: 'Argument', + name: { kind: 'Name', value: 'search' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'search' }, + }, + }, + { + kind: 'Argument', + name: { kind: 'Name', value: 'unassigned' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'unassigned' }, + }, + }, + { + kind: 'Argument', + name: { kind: 'Name', value: 'sprintId' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'sprintId' }, + }, + }, + { + kind: 'Argument', + name: { kind: 'Name', value: 'perColumn' }, + value: { kind: 'IntValue', value: '100' }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'status' }, + }, + { kind: 'Field', name: { kind: 'Name', value: 'total' } }, + { + kind: 'Field', + name: { kind: 'Name', value: 'issues' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { + kind: 'Name', + value: 'IssueSummaryFields', + }, + }, + ], + }, + }, + ], + }, + }, + ], + }, + }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'UserRefFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'UserRef' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'IssueSummaryFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'Issue' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'projectId' } }, + { kind: 'Field', name: { kind: 'Name', value: 'key' } }, + { kind: 'Field', name: { kind: 'Name', value: 'type' } }, + { kind: 'Field', name: { kind: 'Name', value: 'area' } }, + { kind: 'Field', name: { kind: 'Name', value: 'title' } }, + { kind: 'Field', name: { kind: 'Name', value: 'status' } }, + { kind: 'Field', name: { kind: 'Name', value: 'statusCategory' } }, + { kind: 'Field', name: { kind: 'Name', value: 'priority' } }, + { kind: 'Field', name: { kind: 'Name', value: 'labels' } }, + { kind: 'Field', name: { kind: 'Name', value: 'commentCount' } }, + { kind: 'Field', name: { kind: 'Name', value: 'updatedAt' } }, + { kind: 'Field', name: { kind: 'Name', value: 'version' } }, + { + kind: 'Field', + name: { kind: 'Name', value: 'assignee' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'UserRefFields' }, + }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'release' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'sprint' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'parent' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'key' } }, + { kind: 'Field', name: { kind: 'Name', value: 'title' } }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'blockedBy' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'key' } }, + { kind: 'Field', name: { kind: 'Name', value: 'title' } }, + ], + }, + }, + { kind: 'Field', name: { kind: 'Name', value: 'votes' } }, + { kind: 'Field', name: { kind: 'Name', value: 'voted' } }, + { kind: 'Field', name: { kind: 'Name', value: 'rank' } }, + { kind: 'Field', name: { kind: 'Name', value: 'storyPoints' } }, + { kind: 'Field', name: { kind: 'Name', value: 'startDate' } }, + { kind: 'Field', name: { kind: 'Name', value: 'dueDate' } }, + { kind: 'Field', name: { kind: 'Name', value: 'trashedAt' } }, + ], + }, + }, + ], +} as unknown as DocumentNode; +export const IssueDocument = { + kind: 'Document', + definitions: [ + { + kind: 'OperationDefinition', + operation: 'query', + name: { kind: 'Name', value: 'Issue' }, + variableDefinitions: [ + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'idOrKey' }, + }, + type: { + kind: 'NonNullType', + type: { + kind: 'NamedType', + name: { kind: 'Name', value: 'String' }, + }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'issue' }, + arguments: [ + { + kind: 'Argument', + name: { kind: 'Name', value: 'idOrKey' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'idOrKey' }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'IssueFields' }, + }, + ], + }, + }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'UserRefFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'UserRef' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'IssueSummaryFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'Issue' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'projectId' } }, + { kind: 'Field', name: { kind: 'Name', value: 'key' } }, + { kind: 'Field', name: { kind: 'Name', value: 'type' } }, + { kind: 'Field', name: { kind: 'Name', value: 'area' } }, + { kind: 'Field', name: { kind: 'Name', value: 'title' } }, + { kind: 'Field', name: { kind: 'Name', value: 'status' } }, + { kind: 'Field', name: { kind: 'Name', value: 'statusCategory' } }, + { kind: 'Field', name: { kind: 'Name', value: 'priority' } }, + { kind: 'Field', name: { kind: 'Name', value: 'labels' } }, + { kind: 'Field', name: { kind: 'Name', value: 'commentCount' } }, + { kind: 'Field', name: { kind: 'Name', value: 'updatedAt' } }, + { kind: 'Field', name: { kind: 'Name', value: 'version' } }, + { + kind: 'Field', + name: { kind: 'Name', value: 'assignee' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'UserRefFields' }, + }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'release' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'sprint' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'parent' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'key' } }, + { kind: 'Field', name: { kind: 'Name', value: 'title' } }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'blockedBy' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'key' } }, + { kind: 'Field', name: { kind: 'Name', value: 'title' } }, + ], + }, + }, + { kind: 'Field', name: { kind: 'Name', value: 'votes' } }, + { kind: 'Field', name: { kind: 'Name', value: 'voted' } }, + { kind: 'Field', name: { kind: 'Name', value: 'rank' } }, + { kind: 'Field', name: { kind: 'Name', value: 'storyPoints' } }, + { kind: 'Field', name: { kind: 'Name', value: 'startDate' } }, + { kind: 'Field', name: { kind: 'Name', value: 'dueDate' } }, + { kind: 'Field', name: { kind: 'Name', value: 'trashedAt' } }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'IssueFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'Issue' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'IssueSummaryFields' }, + }, + { kind: 'Field', name: { kind: 'Name', value: 'description' } }, + { kind: 'Field', name: { kind: 'Name', value: 'figmaUrl' } }, + { kind: 'Field', name: { kind: 'Name', value: 'createdAt' } }, + { + kind: 'Field', + name: { kind: 'Name', value: 'allowedTransitions' }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'reporter' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'UserRefFields' }, + }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'links' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'type' } }, + { kind: 'Field', name: { kind: 'Name', value: 'direction' } }, + { kind: 'Field', name: { kind: 'Name', value: 'issueId' } }, + { kind: 'Field', name: { kind: 'Name', value: 'issueKey' } }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'watchers' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'UserRefFields' }, + }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'checklist' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'text' } }, + { kind: 'Field', name: { kind: 'Name', value: 'done' } }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'devLinks' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'kind' } }, + { kind: 'Field', name: { kind: 'Name', value: 'url' } }, + { kind: 'Field', name: { kind: 'Name', value: 'title' } }, + { kind: 'Field', name: { kind: 'Name', value: 'ref' } }, + { kind: 'Field', name: { kind: 'Name', value: 'state' } }, + { kind: 'Field', name: { kind: 'Name', value: 'provider' } }, + { kind: 'Field', name: { kind: 'Name', value: 'repository' } }, + { kind: 'Field', name: { kind: 'Name', value: 'author' } }, + { kind: 'Field', name: { kind: 'Name', value: 'at' } }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'attachments' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'fileName' } }, + { kind: 'Field', name: { kind: 'Name', value: 'mimeType' } }, + { kind: 'Field', name: { kind: 'Name', value: 'size' } }, + { kind: 'Field', name: { kind: 'Name', value: 'uploadedAt' } }, + { kind: 'Field', name: { kind: 'Name', value: 'commentId' } }, + { + kind: 'Field', + name: { kind: 'Name', value: 'uploadedBy' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'UserRefFields' }, + }, + ], + }, + }, + ], + }, + }, + ], + }, + }, + ], +} as unknown as DocumentNode; +export const SearchIssuesDocument = { + kind: 'Document', + definitions: [ + { + kind: 'OperationDefinition', + operation: 'query', + name: { kind: 'Name', value: 'SearchIssues' }, + variableDefinitions: [ + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'filter' }, + }, + type: { + kind: 'NonNullType', + type: { + kind: 'NamedType', + name: { kind: 'Name', value: 'IssueFilterInput' }, + }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'issues' }, + arguments: [ + { + kind: 'Argument', + name: { kind: 'Name', value: 'filter' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'filter' }, + }, + }, + { + kind: 'Argument', + name: { kind: 'Name', value: 'limit' }, + value: { kind: 'IntValue', value: '20' }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'items' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'IssueSummaryFields' }, + }, + ], + }, + }, + ], + }, + }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'UserRefFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'UserRef' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'IssueSummaryFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'Issue' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'projectId' } }, + { kind: 'Field', name: { kind: 'Name', value: 'key' } }, + { kind: 'Field', name: { kind: 'Name', value: 'type' } }, + { kind: 'Field', name: { kind: 'Name', value: 'area' } }, + { kind: 'Field', name: { kind: 'Name', value: 'title' } }, + { kind: 'Field', name: { kind: 'Name', value: 'status' } }, + { kind: 'Field', name: { kind: 'Name', value: 'statusCategory' } }, + { kind: 'Field', name: { kind: 'Name', value: 'priority' } }, + { kind: 'Field', name: { kind: 'Name', value: 'labels' } }, + { kind: 'Field', name: { kind: 'Name', value: 'commentCount' } }, + { kind: 'Field', name: { kind: 'Name', value: 'updatedAt' } }, + { kind: 'Field', name: { kind: 'Name', value: 'version' } }, + { + kind: 'Field', + name: { kind: 'Name', value: 'assignee' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'UserRefFields' }, + }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'release' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'sprint' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'parent' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'key' } }, + { kind: 'Field', name: { kind: 'Name', value: 'title' } }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'blockedBy' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'key' } }, + { kind: 'Field', name: { kind: 'Name', value: 'title' } }, + ], + }, + }, + { kind: 'Field', name: { kind: 'Name', value: 'votes' } }, + { kind: 'Field', name: { kind: 'Name', value: 'voted' } }, + { kind: 'Field', name: { kind: 'Name', value: 'rank' } }, + { kind: 'Field', name: { kind: 'Name', value: 'storyPoints' } }, + { kind: 'Field', name: { kind: 'Name', value: 'startDate' } }, + { kind: 'Field', name: { kind: 'Name', value: 'dueDate' } }, + { kind: 'Field', name: { kind: 'Name', value: 'trashedAt' } }, + ], + }, + }, + ], +} as unknown as DocumentNode; +export const CreateIssueDocument = { + kind: 'Document', + definitions: [ + { + kind: 'OperationDefinition', + operation: 'mutation', + name: { kind: 'Name', value: 'CreateIssue' }, + variableDefinitions: [ + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'input' }, + }, + type: { + kind: 'NonNullType', + type: { + kind: 'NamedType', + name: { kind: 'Name', value: 'CreateIssueInput' }, + }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'createIssue' }, + arguments: [ + { + kind: 'Argument', + name: { kind: 'Name', value: 'input' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'input' }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'CommandResultFields' }, + }, + ], + }, + }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'CommandResultFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'CommandResult' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'key' } }, + { kind: 'Field', name: { kind: 'Name', value: 'version' } }, + ], + }, + }, + ], +} as unknown as DocumentNode; +export const UpdateIssueDocument = { + kind: 'Document', + definitions: [ + { + kind: 'OperationDefinition', + operation: 'mutation', + name: { kind: 'Name', value: 'UpdateIssue' }, + variableDefinitions: [ + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'input' }, + }, + type: { + kind: 'NonNullType', + type: { + kind: 'NamedType', + name: { kind: 'Name', value: 'UpdateIssueInput' }, + }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'updateIssue' }, + arguments: [ + { + kind: 'Argument', + name: { kind: 'Name', value: 'input' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'input' }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'CommandResultFields' }, + }, + ], + }, + }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'CommandResultFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'CommandResult' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'key' } }, + { kind: 'Field', name: { kind: 'Name', value: 'version' } }, + ], + }, + }, + ], +} as unknown as DocumentNode; +export const ChangeIssueStatusDocument = { + kind: 'Document', + definitions: [ + { + kind: 'OperationDefinition', + operation: 'mutation', + name: { kind: 'Name', value: 'ChangeIssueStatus' }, + variableDefinitions: [ + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'input' }, + }, + type: { + kind: 'NonNullType', + type: { + kind: 'NamedType', + name: { kind: 'Name', value: 'ChangeIssueStatusInput' }, + }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'changeIssueStatus' }, + arguments: [ + { + kind: 'Argument', + name: { kind: 'Name', value: 'input' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'input' }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'CommandResultFields' }, + }, + ], + }, + }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'CommandResultFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'CommandResult' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'key' } }, + { kind: 'Field', name: { kind: 'Name', value: 'version' } }, + ], + }, + }, + ], +} as unknown as DocumentNode< + ChangeIssueStatusMutation, + ChangeIssueStatusMutationVariables +>; +export const AssignIssueDocument = { + kind: 'Document', + definitions: [ + { + kind: 'OperationDefinition', + operation: 'mutation', + name: { kind: 'Name', value: 'AssignIssue' }, + variableDefinitions: [ + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'issueId' }, + }, + type: { + kind: 'NonNullType', + type: { kind: 'NamedType', name: { kind: 'Name', value: 'ID' } }, + }, + }, + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'assigneeId' }, + }, + type: { kind: 'NamedType', name: { kind: 'Name', value: 'ID' } }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'assignIssue' }, + arguments: [ + { + kind: 'Argument', + name: { kind: 'Name', value: 'issueId' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'issueId' }, + }, + }, + { + kind: 'Argument', + name: { kind: 'Name', value: 'assigneeId' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'assigneeId' }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'CommandResultFields' }, + }, + ], + }, + }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'CommandResultFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'CommandResult' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'key' } }, + { kind: 'Field', name: { kind: 'Name', value: 'version' } }, + ], + }, + }, + ], +} as unknown as DocumentNode; +export const LinkIssuesDocument = { + kind: 'Document', + definitions: [ + { + kind: 'OperationDefinition', + operation: 'mutation', + name: { kind: 'Name', value: 'LinkIssues' }, + variableDefinitions: [ + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'input' }, + }, + type: { + kind: 'NonNullType', + type: { + kind: 'NamedType', + name: { kind: 'Name', value: 'LinkIssuesInput' }, + }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'linkIssues' }, + arguments: [ + { + kind: 'Argument', + name: { kind: 'Name', value: 'input' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'input' }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'CommandResultFields' }, + }, + ], + }, + }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'CommandResultFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'CommandResult' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'key' } }, + { kind: 'Field', name: { kind: 'Name', value: 'version' } }, + ], + }, + }, + ], +} as unknown as DocumentNode; +export const UnlinkIssuesDocument = { + kind: 'Document', + definitions: [ + { + kind: 'OperationDefinition', + operation: 'mutation', + name: { kind: 'Name', value: 'UnlinkIssues' }, + variableDefinitions: [ + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'input' }, + }, + type: { + kind: 'NonNullType', + type: { + kind: 'NamedType', + name: { kind: 'Name', value: 'LinkIssuesInput' }, + }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'unlinkIssues' }, + arguments: [ + { + kind: 'Argument', + name: { kind: 'Name', value: 'input' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'input' }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'CommandResultFields' }, + }, + ], + }, + }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'CommandResultFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'CommandResult' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'key' } }, + { kind: 'Field', name: { kind: 'Name', value: 'version' } }, + ], + }, + }, + ], +} as unknown as DocumentNode< + UnlinkIssuesMutation, + UnlinkIssuesMutationVariables +>; +export const WatchIssueDocument = { + kind: 'Document', + definitions: [ + { + kind: 'OperationDefinition', + operation: 'mutation', + name: { kind: 'Name', value: 'WatchIssue' }, + variableDefinitions: [ + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'issueId' }, + }, + type: { + kind: 'NonNullType', + type: { kind: 'NamedType', name: { kind: 'Name', value: 'ID' } }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'watchIssue' }, + arguments: [ + { + kind: 'Argument', + name: { kind: 'Name', value: 'issueId' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'issueId' }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'CommandResultFields' }, + }, + ], + }, + }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'CommandResultFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'CommandResult' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'key' } }, + { kind: 'Field', name: { kind: 'Name', value: 'version' } }, + ], + }, + }, + ], +} as unknown as DocumentNode; +export const UnwatchIssueDocument = { + kind: 'Document', + definitions: [ + { + kind: 'OperationDefinition', + operation: 'mutation', + name: { kind: 'Name', value: 'UnwatchIssue' }, + variableDefinitions: [ + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'issueId' }, + }, + type: { + kind: 'NonNullType', + type: { kind: 'NamedType', name: { kind: 'Name', value: 'ID' } }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'unwatchIssue' }, + arguments: [ + { + kind: 'Argument', + name: { kind: 'Name', value: 'issueId' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'issueId' }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'CommandResultFields' }, + }, + ], + }, + }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'CommandResultFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'CommandResult' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'key' } }, + { kind: 'Field', name: { kind: 'Name', value: 'version' } }, + ], + }, + }, + ], +} as unknown as DocumentNode< + UnwatchIssueMutation, + UnwatchIssueMutationVariables +>; +export const SetIssueReleaseDocument = { + kind: 'Document', + definitions: [ + { + kind: 'OperationDefinition', + operation: 'mutation', + name: { kind: 'Name', value: 'SetIssueRelease' }, + variableDefinitions: [ + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'issueId' }, + }, + type: { + kind: 'NonNullType', + type: { kind: 'NamedType', name: { kind: 'Name', value: 'ID' } }, + }, + }, + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'releaseId' }, + }, + type: { kind: 'NamedType', name: { kind: 'Name', value: 'ID' } }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'setIssueRelease' }, + arguments: [ + { + kind: 'Argument', + name: { kind: 'Name', value: 'issueId' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'issueId' }, + }, + }, + { + kind: 'Argument', + name: { kind: 'Name', value: 'releaseId' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'releaseId' }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'CommandResultFields' }, + }, + ], + }, + }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'CommandResultFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'CommandResult' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'key' } }, + { kind: 'Field', name: { kind: 'Name', value: 'version' } }, + ], + }, + }, + ], +} as unknown as DocumentNode< + SetIssueReleaseMutation, + SetIssueReleaseMutationVariables +>; +export const IssueCommentsDocument = { + kind: 'Document', + definitions: [ + { + kind: 'OperationDefinition', + operation: 'query', + name: { kind: 'Name', value: 'IssueComments' }, + variableDefinitions: [ + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'idOrKey' }, + }, + type: { + kind: 'NonNullType', + type: { + kind: 'NamedType', + name: { kind: 'Name', value: 'String' }, + }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'issue' }, + arguments: [ + { + kind: 'Argument', + name: { kind: 'Name', value: 'idOrKey' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'idOrKey' }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { + kind: 'Field', + name: { kind: 'Name', value: 'comments' }, + arguments: [ + { + kind: 'Argument', + name: { kind: 'Name', value: 'limit' }, + value: { kind: 'IntValue', value: '200' }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'items' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'CommentFields' }, + }, + ], + }, + }, + ], + }, + }, + ], + }, + }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'UserRefFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'UserRef' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'CommentFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'Comment' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'issueId' } }, + { kind: 'Field', name: { kind: 'Name', value: 'body' } }, + { kind: 'Field', name: { kind: 'Name', value: 'replyTo' } }, + { kind: 'Field', name: { kind: 'Name', value: 'deleted' } }, + { + kind: 'Field', + name: { kind: 'Name', value: 'reactions' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'emoji' } }, + { + kind: 'Field', + name: { kind: 'Name', value: 'users' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'UserRefFields' }, + }, + ], + }, + }, + ], + }, + }, + { kind: 'Field', name: { kind: 'Name', value: 'createdAt' } }, + { kind: 'Field', name: { kind: 'Name', value: 'editedAt' } }, + { + kind: 'Field', + name: { kind: 'Name', value: 'author' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'UserRefFields' }, + }, + ], + }, + }, + ], + }, + }, + ], +} as unknown as DocumentNode; +export const AddCommentDocument = { + kind: 'Document', + definitions: [ + { + kind: 'OperationDefinition', + operation: 'mutation', + name: { kind: 'Name', value: 'AddComment' }, + variableDefinitions: [ + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'issueId' }, + }, + type: { + kind: 'NonNullType', + type: { kind: 'NamedType', name: { kind: 'Name', value: 'ID' } }, + }, + }, + { + kind: 'VariableDefinition', + variable: { kind: 'Variable', name: { kind: 'Name', value: 'body' } }, + type: { + kind: 'NonNullType', + type: { + kind: 'NamedType', + name: { kind: 'Name', value: 'String' }, + }, + }, + }, + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'replyTo' }, + }, + type: { kind: 'NamedType', name: { kind: 'Name', value: 'ID' } }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'addComment' }, + arguments: [ + { + kind: 'Argument', + name: { kind: 'Name', value: 'issueId' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'issueId' }, + }, + }, + { + kind: 'Argument', + name: { kind: 'Name', value: 'body' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'body' }, + }, + }, + { + kind: 'Argument', + name: { kind: 'Name', value: 'replyTo' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'replyTo' }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'CommandResultFields' }, + }, + ], + }, + }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'CommandResultFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'CommandResult' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'key' } }, + { kind: 'Field', name: { kind: 'Name', value: 'version' } }, + ], + }, + }, + ], +} as unknown as DocumentNode; +export const EditCommentDocument = { + kind: 'Document', + definitions: [ + { + kind: 'OperationDefinition', + operation: 'mutation', + name: { kind: 'Name', value: 'EditComment' }, + variableDefinitions: [ + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'commentId' }, + }, + type: { + kind: 'NonNullType', + type: { kind: 'NamedType', name: { kind: 'Name', value: 'ID' } }, + }, + }, + { + kind: 'VariableDefinition', + variable: { kind: 'Variable', name: { kind: 'Name', value: 'body' } }, + type: { + kind: 'NonNullType', + type: { + kind: 'NamedType', + name: { kind: 'Name', value: 'String' }, + }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'editComment' }, + arguments: [ + { + kind: 'Argument', + name: { kind: 'Name', value: 'commentId' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'commentId' }, + }, + }, + { + kind: 'Argument', + name: { kind: 'Name', value: 'body' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'body' }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'CommandResultFields' }, + }, + ], + }, + }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'CommandResultFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'CommandResult' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'key' } }, + { kind: 'Field', name: { kind: 'Name', value: 'version' } }, + ], + }, + }, + ], +} as unknown as DocumentNode; +export const DeleteCommentDocument = { + kind: 'Document', + definitions: [ + { + kind: 'OperationDefinition', + operation: 'mutation', + name: { kind: 'Name', value: 'DeleteComment' }, + variableDefinitions: [ + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'commentId' }, + }, + type: { + kind: 'NonNullType', + type: { kind: 'NamedType', name: { kind: 'Name', value: 'ID' } }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'deleteComment' }, + arguments: [ + { + kind: 'Argument', + name: { kind: 'Name', value: 'commentId' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'commentId' }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'CommandResultFields' }, + }, + ], + }, + }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'CommandResultFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'CommandResult' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'key' } }, + { kind: 'Field', name: { kind: 'Name', value: 'version' } }, + ], + }, + }, + ], +} as unknown as DocumentNode< + DeleteCommentMutation, + DeleteCommentMutationVariables +>; +export const MyIssuesDocument = { + kind: 'Document', + definitions: [ + { + kind: 'OperationDefinition', + operation: 'query', + name: { kind: 'Name', value: 'MyIssues' }, + variableDefinitions: [ + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'assignedToMe' }, + }, + type: { + kind: 'NonNullType', + type: { + kind: 'NamedType', + name: { kind: 'Name', value: 'Boolean' }, + }, + }, + }, + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'watching' }, + }, + type: { kind: 'NamedType', name: { kind: 'Name', value: 'Boolean' } }, + }, + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'categories' }, + }, + type: { + kind: 'ListType', + type: { + kind: 'NonNullType', + type: { + kind: 'NamedType', + name: { kind: 'Name', value: 'StatusCategory' }, + }, + }, + }, + }, + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'limit' }, + }, + type: { + kind: 'NonNullType', + type: { kind: 'NamedType', name: { kind: 'Name', value: 'Int' } }, + }, + }, + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'search' }, + }, + type: { kind: 'NamedType', name: { kind: 'Name', value: 'String' } }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'myIssues' }, + arguments: [ + { + kind: 'Argument', + name: { kind: 'Name', value: 'assignedToMe' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'assignedToMe' }, + }, + }, + { + kind: 'Argument', + name: { kind: 'Name', value: 'watching' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'watching' }, + }, + }, + { + kind: 'Argument', + name: { kind: 'Name', value: 'categories' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'categories' }, + }, + }, + { + kind: 'Argument', + name: { kind: 'Name', value: 'limit' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'limit' }, + }, + }, + { + kind: 'Argument', + name: { kind: 'Name', value: 'search' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'search' }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'total' } }, + { + kind: 'Field', + name: { kind: 'Name', value: 'items' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'IssueSummaryFields' }, + }, + ], + }, + }, + ], + }, + }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'UserRefFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'UserRef' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'IssueSummaryFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'Issue' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'projectId' } }, + { kind: 'Field', name: { kind: 'Name', value: 'key' } }, + { kind: 'Field', name: { kind: 'Name', value: 'type' } }, + { kind: 'Field', name: { kind: 'Name', value: 'area' } }, + { kind: 'Field', name: { kind: 'Name', value: 'title' } }, + { kind: 'Field', name: { kind: 'Name', value: 'status' } }, + { kind: 'Field', name: { kind: 'Name', value: 'statusCategory' } }, + { kind: 'Field', name: { kind: 'Name', value: 'priority' } }, + { kind: 'Field', name: { kind: 'Name', value: 'labels' } }, + { kind: 'Field', name: { kind: 'Name', value: 'commentCount' } }, + { kind: 'Field', name: { kind: 'Name', value: 'updatedAt' } }, + { kind: 'Field', name: { kind: 'Name', value: 'version' } }, + { + kind: 'Field', + name: { kind: 'Name', value: 'assignee' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'UserRefFields' }, + }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'release' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'sprint' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'parent' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'key' } }, + { kind: 'Field', name: { kind: 'Name', value: 'title' } }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'blockedBy' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'key' } }, + { kind: 'Field', name: { kind: 'Name', value: 'title' } }, + ], + }, + }, + { kind: 'Field', name: { kind: 'Name', value: 'votes' } }, + { kind: 'Field', name: { kind: 'Name', value: 'voted' } }, + { kind: 'Field', name: { kind: 'Name', value: 'rank' } }, + { kind: 'Field', name: { kind: 'Name', value: 'storyPoints' } }, + { kind: 'Field', name: { kind: 'Name', value: 'startDate' } }, + { kind: 'Field', name: { kind: 'Name', value: 'dueDate' } }, + { kind: 'Field', name: { kind: 'Name', value: 'trashedAt' } }, + ], + }, + }, + ], +} as unknown as DocumentNode; +export const IssueChildrenDocument = { + kind: 'Document', + definitions: [ + { + kind: 'OperationDefinition', + operation: 'query', + name: { kind: 'Name', value: 'IssueChildren' }, + variableDefinitions: [ + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'filter' }, + }, + type: { + kind: 'NonNullType', + type: { + kind: 'NamedType', + name: { kind: 'Name', value: 'IssueFilterInput' }, + }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'issues' }, + arguments: [ + { + kind: 'Argument', + name: { kind: 'Name', value: 'filter' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'filter' }, + }, + }, + { + kind: 'Argument', + name: { kind: 'Name', value: 'limit' }, + value: { kind: 'IntValue', value: '200' }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'items' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'IssueSummaryFields' }, + }, + ], + }, + }, + ], + }, + }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'UserRefFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'UserRef' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'IssueSummaryFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'Issue' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'projectId' } }, + { kind: 'Field', name: { kind: 'Name', value: 'key' } }, + { kind: 'Field', name: { kind: 'Name', value: 'type' } }, + { kind: 'Field', name: { kind: 'Name', value: 'area' } }, + { kind: 'Field', name: { kind: 'Name', value: 'title' } }, + { kind: 'Field', name: { kind: 'Name', value: 'status' } }, + { kind: 'Field', name: { kind: 'Name', value: 'statusCategory' } }, + { kind: 'Field', name: { kind: 'Name', value: 'priority' } }, + { kind: 'Field', name: { kind: 'Name', value: 'labels' } }, + { kind: 'Field', name: { kind: 'Name', value: 'commentCount' } }, + { kind: 'Field', name: { kind: 'Name', value: 'updatedAt' } }, + { kind: 'Field', name: { kind: 'Name', value: 'version' } }, + { + kind: 'Field', + name: { kind: 'Name', value: 'assignee' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'UserRefFields' }, + }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'release' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'sprint' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'parent' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'key' } }, + { kind: 'Field', name: { kind: 'Name', value: 'title' } }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'blockedBy' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'key' } }, + { kind: 'Field', name: { kind: 'Name', value: 'title' } }, + ], + }, + }, + { kind: 'Field', name: { kind: 'Name', value: 'votes' } }, + { kind: 'Field', name: { kind: 'Name', value: 'voted' } }, + { kind: 'Field', name: { kind: 'Name', value: 'rank' } }, + { kind: 'Field', name: { kind: 'Name', value: 'storyPoints' } }, + { kind: 'Field', name: { kind: 'Name', value: 'startDate' } }, + { kind: 'Field', name: { kind: 'Name', value: 'dueDate' } }, + { kind: 'Field', name: { kind: 'Name', value: 'trashedAt' } }, + ], + }, + }, + ], +} as unknown as DocumentNode; +export const EpicsDocument = { + kind: 'Document', + definitions: [ + { + kind: 'OperationDefinition', + operation: 'query', + name: { kind: 'Name', value: 'Epics' }, + variableDefinitions: [ + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'projectId' }, + }, + type: { + kind: 'NonNullType', + type: { kind: 'NamedType', name: { kind: 'Name', value: 'ID' } }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'epics' }, + arguments: [ + { + kind: 'Argument', + name: { kind: 'Name', value: 'projectId' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'projectId' }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'issue' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'IssueSummaryFields' }, + }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'progress' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'total' } }, + { + kind: 'Field', + name: { kind: 'Name', value: 'finished' }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'percent' }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'storyPoints' }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'finishedStoryPoints' }, + }, + ], + }, + }, + ], + }, + }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'UserRefFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'UserRef' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'IssueSummaryFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'Issue' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'projectId' } }, + { kind: 'Field', name: { kind: 'Name', value: 'key' } }, + { kind: 'Field', name: { kind: 'Name', value: 'type' } }, + { kind: 'Field', name: { kind: 'Name', value: 'area' } }, + { kind: 'Field', name: { kind: 'Name', value: 'title' } }, + { kind: 'Field', name: { kind: 'Name', value: 'status' } }, + { kind: 'Field', name: { kind: 'Name', value: 'statusCategory' } }, + { kind: 'Field', name: { kind: 'Name', value: 'priority' } }, + { kind: 'Field', name: { kind: 'Name', value: 'labels' } }, + { kind: 'Field', name: { kind: 'Name', value: 'commentCount' } }, + { kind: 'Field', name: { kind: 'Name', value: 'updatedAt' } }, + { kind: 'Field', name: { kind: 'Name', value: 'version' } }, + { + kind: 'Field', + name: { kind: 'Name', value: 'assignee' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'UserRefFields' }, + }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'release' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'sprint' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'parent' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'key' } }, + { kind: 'Field', name: { kind: 'Name', value: 'title' } }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'blockedBy' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'key' } }, + { kind: 'Field', name: { kind: 'Name', value: 'title' } }, + ], + }, + }, + { kind: 'Field', name: { kind: 'Name', value: 'votes' } }, + { kind: 'Field', name: { kind: 'Name', value: 'voted' } }, + { kind: 'Field', name: { kind: 'Name', value: 'rank' } }, + { kind: 'Field', name: { kind: 'Name', value: 'storyPoints' } }, + { kind: 'Field', name: { kind: 'Name', value: 'startDate' } }, + { kind: 'Field', name: { kind: 'Name', value: 'dueDate' } }, + { kind: 'Field', name: { kind: 'Name', value: 'trashedAt' } }, + ], + }, + }, + ], +} as unknown as DocumentNode; +export const SetIssueParentDocument = { + kind: 'Document', + definitions: [ + { + kind: 'OperationDefinition', + operation: 'mutation', + name: { kind: 'Name', value: 'SetIssueParent' }, + variableDefinitions: [ + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'issueId' }, + }, + type: { + kind: 'NonNullType', + type: { kind: 'NamedType', name: { kind: 'Name', value: 'ID' } }, + }, + }, + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'parentId' }, + }, + type: { kind: 'NamedType', name: { kind: 'Name', value: 'ID' } }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'setIssueParent' }, + arguments: [ + { + kind: 'Argument', + name: { kind: 'Name', value: 'issueId' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'issueId' }, + }, + }, + { + kind: 'Argument', + name: { kind: 'Name', value: 'parentId' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'parentId' }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'CommandResultFields' }, + }, + ], + }, + }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'CommandResultFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'CommandResult' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'key' } }, + { kind: 'Field', name: { kind: 'Name', value: 'version' } }, + ], + }, + }, + ], +} as unknown as DocumentNode< + SetIssueParentMutation, + SetIssueParentMutationVariables +>; +export const AddChecklistItemDocument = { + kind: 'Document', + definitions: [ + { + kind: 'OperationDefinition', + operation: 'mutation', + name: { kind: 'Name', value: 'AddChecklistItem' }, + variableDefinitions: [ + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'input' }, + }, + type: { + kind: 'NonNullType', + type: { + kind: 'NamedType', + name: { kind: 'Name', value: 'AddChecklistItemInput' }, + }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'addChecklistItem' }, + arguments: [ + { + kind: 'Argument', + name: { kind: 'Name', value: 'input' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'input' }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'CommandResultFields' }, + }, + ], + }, + }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'CommandResultFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'CommandResult' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'key' } }, + { kind: 'Field', name: { kind: 'Name', value: 'version' } }, + ], + }, + }, + ], +} as unknown as DocumentNode< + AddChecklistItemMutation, + AddChecklistItemMutationVariables +>; +export const UpdateChecklistItemDocument = { + kind: 'Document', + definitions: [ + { + kind: 'OperationDefinition', + operation: 'mutation', + name: { kind: 'Name', value: 'UpdateChecklistItem' }, + variableDefinitions: [ + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'input' }, + }, + type: { + kind: 'NonNullType', + type: { + kind: 'NamedType', + name: { kind: 'Name', value: 'UpdateChecklistItemInput' }, + }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'updateChecklistItem' }, + arguments: [ + { + kind: 'Argument', + name: { kind: 'Name', value: 'input' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'input' }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'CommandResultFields' }, + }, + ], + }, + }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'CommandResultFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'CommandResult' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'key' } }, + { kind: 'Field', name: { kind: 'Name', value: 'version' } }, + ], + }, + }, + ], +} as unknown as DocumentNode< + UpdateChecklistItemMutation, + UpdateChecklistItemMutationVariables +>; +export const RemoveChecklistItemDocument = { + kind: 'Document', + definitions: [ + { + kind: 'OperationDefinition', + operation: 'mutation', + name: { kind: 'Name', value: 'RemoveChecklistItem' }, + variableDefinitions: [ + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'issueId' }, + }, + type: { + kind: 'NonNullType', + type: { kind: 'NamedType', name: { kind: 'Name', value: 'ID' } }, + }, + }, + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'itemId' }, + }, + type: { + kind: 'NonNullType', + type: { kind: 'NamedType', name: { kind: 'Name', value: 'ID' } }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'removeChecklistItem' }, + arguments: [ + { + kind: 'Argument', + name: { kind: 'Name', value: 'issueId' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'issueId' }, + }, + }, + { + kind: 'Argument', + name: { kind: 'Name', value: 'itemId' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'itemId' }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'CommandResultFields' }, + }, + ], + }, + }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'CommandResultFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'CommandResult' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'key' } }, + { kind: 'Field', name: { kind: 'Name', value: 'version' } }, + ], + }, + }, + ], +} as unknown as DocumentNode< + RemoveChecklistItemMutation, + RemoveChecklistItemMutationVariables +>; +export const BacklogDocument = { + kind: 'Document', + definitions: [ + { + kind: 'OperationDefinition', + operation: 'query', + name: { kind: 'Name', value: 'Backlog' }, + variableDefinitions: [ + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'filter' }, + }, + type: { + kind: 'NonNullType', + type: { + kind: 'NamedType', + name: { kind: 'Name', value: 'IssueFilterInput' }, + }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'issues' }, + arguments: [ + { + kind: 'Argument', + name: { kind: 'Name', value: 'filter' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'filter' }, + }, + }, + { + kind: 'Argument', + name: { kind: 'Name', value: 'limit' }, + value: { kind: 'IntValue', value: '200' }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'items' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'IssueSummaryFields' }, + }, + ], + }, + }, + { kind: 'Field', name: { kind: 'Name', value: 'total' } }, + ], + }, + }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'UserRefFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'UserRef' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'IssueSummaryFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'Issue' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'projectId' } }, + { kind: 'Field', name: { kind: 'Name', value: 'key' } }, + { kind: 'Field', name: { kind: 'Name', value: 'type' } }, + { kind: 'Field', name: { kind: 'Name', value: 'area' } }, + { kind: 'Field', name: { kind: 'Name', value: 'title' } }, + { kind: 'Field', name: { kind: 'Name', value: 'status' } }, + { kind: 'Field', name: { kind: 'Name', value: 'statusCategory' } }, + { kind: 'Field', name: { kind: 'Name', value: 'priority' } }, + { kind: 'Field', name: { kind: 'Name', value: 'labels' } }, + { kind: 'Field', name: { kind: 'Name', value: 'commentCount' } }, + { kind: 'Field', name: { kind: 'Name', value: 'updatedAt' } }, + { kind: 'Field', name: { kind: 'Name', value: 'version' } }, + { + kind: 'Field', + name: { kind: 'Name', value: 'assignee' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'UserRefFields' }, + }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'release' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'sprint' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'parent' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'key' } }, + { kind: 'Field', name: { kind: 'Name', value: 'title' } }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'blockedBy' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'key' } }, + { kind: 'Field', name: { kind: 'Name', value: 'title' } }, + ], + }, + }, + { kind: 'Field', name: { kind: 'Name', value: 'votes' } }, + { kind: 'Field', name: { kind: 'Name', value: 'voted' } }, + { kind: 'Field', name: { kind: 'Name', value: 'rank' } }, + { kind: 'Field', name: { kind: 'Name', value: 'storyPoints' } }, + { kind: 'Field', name: { kind: 'Name', value: 'startDate' } }, + { kind: 'Field', name: { kind: 'Name', value: 'dueDate' } }, + { kind: 'Field', name: { kind: 'Name', value: 'trashedAt' } }, + ], + }, + }, + ], +} as unknown as DocumentNode; +export const RankIssueDocument = { + kind: 'Document', + definitions: [ + { + kind: 'OperationDefinition', + operation: 'mutation', + name: { kind: 'Name', value: 'RankIssue' }, + variableDefinitions: [ + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'input' }, + }, + type: { + kind: 'NonNullType', + type: { + kind: 'NamedType', + name: { kind: 'Name', value: 'RankIssueInput' }, + }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'rankIssue' }, + arguments: [ + { + kind: 'Argument', + name: { kind: 'Name', value: 'input' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'input' }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'CommandResultFields' }, + }, + ], + }, + }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'CommandResultFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'CommandResult' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'key' } }, + { kind: 'Field', name: { kind: 'Name', value: 'version' } }, + ], + }, + }, + ], +} as unknown as DocumentNode; +export const BulkUpdateIssuesDocument = { + kind: 'Document', + definitions: [ + { + kind: 'OperationDefinition', + operation: 'mutation', + name: { kind: 'Name', value: 'BulkUpdateIssues' }, + variableDefinitions: [ + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'input' }, + }, + type: { + kind: 'NonNullType', + type: { + kind: 'NamedType', + name: { kind: 'Name', value: 'BulkUpdateIssuesInput' }, + }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'bulkUpdateIssues' }, + arguments: [ + { + kind: 'Argument', + name: { kind: 'Name', value: 'input' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'input' }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'updated' } }, + { + kind: 'Field', + name: { kind: 'Name', value: 'results' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'issueId' }, + }, + { kind: 'Field', name: { kind: 'Name', value: 'ok' } }, + { kind: 'Field', name: { kind: 'Name', value: 'error' } }, + ], + }, + }, + ], + }, + }, + ], + }, + }, + ], +} as unknown as DocumentNode< + BulkUpdateIssuesMutation, + BulkUpdateIssuesMutationVariables +>; +export const TrashIssueDocument = { + kind: 'Document', + definitions: [ + { + kind: 'OperationDefinition', + operation: 'mutation', + name: { kind: 'Name', value: 'TrashIssue' }, + variableDefinitions: [ + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'issueId' }, + }, + type: { + kind: 'NonNullType', + type: { kind: 'NamedType', name: { kind: 'Name', value: 'ID' } }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'trashIssue' }, + arguments: [ + { + kind: 'Argument', + name: { kind: 'Name', value: 'issueId' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'issueId' }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'CommandResultFields' }, + }, + ], + }, + }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'CommandResultFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'CommandResult' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'key' } }, + { kind: 'Field', name: { kind: 'Name', value: 'version' } }, + ], + }, + }, + ], +} as unknown as DocumentNode; +export const RestoreIssueDocument = { + kind: 'Document', + definitions: [ + { + kind: 'OperationDefinition', + operation: 'mutation', + name: { kind: 'Name', value: 'RestoreIssue' }, + variableDefinitions: [ + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'issueId' }, + }, + type: { + kind: 'NonNullType', + type: { kind: 'NamedType', name: { kind: 'Name', value: 'ID' } }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'restoreIssue' }, + arguments: [ + { + kind: 'Argument', + name: { kind: 'Name', value: 'issueId' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'issueId' }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'CommandResultFields' }, + }, + ], + }, + }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'CommandResultFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'CommandResult' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'key' } }, + { kind: 'Field', name: { kind: 'Name', value: 'version' } }, + ], + }, + }, + ], +} as unknown as DocumentNode< + RestoreIssueMutation, + RestoreIssueMutationVariables +>; +export const TrashDocument = { + kind: 'Document', + definitions: [ + { + kind: 'OperationDefinition', + operation: 'query', + name: { kind: 'Name', value: 'Trash' }, + variableDefinitions: [ + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'projectId' }, + }, + type: { + kind: 'NonNullType', + type: { kind: 'NamedType', name: { kind: 'Name', value: 'ID' } }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'trash' }, + arguments: [ + { + kind: 'Argument', + name: { kind: 'Name', value: 'projectId' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'projectId' }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'IssueSummaryFields' }, + }, + ], + }, + }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'UserRefFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'UserRef' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'IssueSummaryFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'Issue' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'projectId' } }, + { kind: 'Field', name: { kind: 'Name', value: 'key' } }, + { kind: 'Field', name: { kind: 'Name', value: 'type' } }, + { kind: 'Field', name: { kind: 'Name', value: 'area' } }, + { kind: 'Field', name: { kind: 'Name', value: 'title' } }, + { kind: 'Field', name: { kind: 'Name', value: 'status' } }, + { kind: 'Field', name: { kind: 'Name', value: 'statusCategory' } }, + { kind: 'Field', name: { kind: 'Name', value: 'priority' } }, + { kind: 'Field', name: { kind: 'Name', value: 'labels' } }, + { kind: 'Field', name: { kind: 'Name', value: 'commentCount' } }, + { kind: 'Field', name: { kind: 'Name', value: 'updatedAt' } }, + { kind: 'Field', name: { kind: 'Name', value: 'version' } }, + { + kind: 'Field', + name: { kind: 'Name', value: 'assignee' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'UserRefFields' }, + }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'release' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'sprint' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'parent' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'key' } }, + { kind: 'Field', name: { kind: 'Name', value: 'title' } }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'blockedBy' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'key' } }, + { kind: 'Field', name: { kind: 'Name', value: 'title' } }, + ], + }, + }, + { kind: 'Field', name: { kind: 'Name', value: 'votes' } }, + { kind: 'Field', name: { kind: 'Name', value: 'voted' } }, + { kind: 'Field', name: { kind: 'Name', value: 'rank' } }, + { kind: 'Field', name: { kind: 'Name', value: 'storyPoints' } }, + { kind: 'Field', name: { kind: 'Name', value: 'startDate' } }, + { kind: 'Field', name: { kind: 'Name', value: 'dueDate' } }, + { kind: 'Field', name: { kind: 'Name', value: 'trashedAt' } }, + ], + }, + }, + ], +} as unknown as DocumentNode; +export const DueIssuesDocument = { + kind: 'Document', + definitions: [ + { + kind: 'OperationDefinition', + operation: 'query', + name: { kind: 'Name', value: 'DueIssues' }, + variableDefinitions: [ + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'filter' }, + }, + type: { + kind: 'NonNullType', + type: { + kind: 'NamedType', + name: { kind: 'Name', value: 'IssueFilterInput' }, + }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'issues' }, + arguments: [ + { + kind: 'Argument', + name: { kind: 'Name', value: 'filter' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'filter' }, + }, + }, + { + kind: 'Argument', + name: { kind: 'Name', value: 'limit' }, + value: { kind: 'IntValue', value: '200' }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'items' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'IssueSummaryFields' }, + }, + ], + }, + }, + ], + }, + }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'UserRefFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'UserRef' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'IssueSummaryFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'Issue' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'projectId' } }, + { kind: 'Field', name: { kind: 'Name', value: 'key' } }, + { kind: 'Field', name: { kind: 'Name', value: 'type' } }, + { kind: 'Field', name: { kind: 'Name', value: 'area' } }, + { kind: 'Field', name: { kind: 'Name', value: 'title' } }, + { kind: 'Field', name: { kind: 'Name', value: 'status' } }, + { kind: 'Field', name: { kind: 'Name', value: 'statusCategory' } }, + { kind: 'Field', name: { kind: 'Name', value: 'priority' } }, + { kind: 'Field', name: { kind: 'Name', value: 'labels' } }, + { kind: 'Field', name: { kind: 'Name', value: 'commentCount' } }, + { kind: 'Field', name: { kind: 'Name', value: 'updatedAt' } }, + { kind: 'Field', name: { kind: 'Name', value: 'version' } }, + { + kind: 'Field', + name: { kind: 'Name', value: 'assignee' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'UserRefFields' }, + }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'release' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'sprint' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'parent' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'key' } }, + { kind: 'Field', name: { kind: 'Name', value: 'title' } }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'blockedBy' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'key' } }, + { kind: 'Field', name: { kind: 'Name', value: 'title' } }, + ], + }, + }, + { kind: 'Field', name: { kind: 'Name', value: 'votes' } }, + { kind: 'Field', name: { kind: 'Name', value: 'voted' } }, + { kind: 'Field', name: { kind: 'Name', value: 'rank' } }, + { kind: 'Field', name: { kind: 'Name', value: 'storyPoints' } }, + { kind: 'Field', name: { kind: 'Name', value: 'startDate' } }, + { kind: 'Field', name: { kind: 'Name', value: 'dueDate' } }, + { kind: 'Field', name: { kind: 'Name', value: 'trashedAt' } }, + ], + }, + }, + ], +} as unknown as DocumentNode; +export const IssueListDocument = { + kind: 'Document', + definitions: [ + { + kind: 'OperationDefinition', + operation: 'query', + name: { kind: 'Name', value: 'IssueList' }, + variableDefinitions: [ + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'filter' }, + }, + type: { + kind: 'NonNullType', + type: { + kind: 'NamedType', + name: { kind: 'Name', value: 'IssueFilterInput' }, + }, + }, + }, + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'limit' }, + }, + type: { + kind: 'NonNullType', + type: { kind: 'NamedType', name: { kind: 'Name', value: 'Int' } }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'issues' }, + arguments: [ + { + kind: 'Argument', + name: { kind: 'Name', value: 'filter' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'filter' }, + }, + }, + { + kind: 'Argument', + name: { kind: 'Name', value: 'limit' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'limit' }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'items' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'IssueSummaryFields' }, + }, + ], + }, + }, + { kind: 'Field', name: { kind: 'Name', value: 'total' } }, + ], + }, + }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'UserRefFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'UserRef' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'IssueSummaryFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'Issue' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'projectId' } }, + { kind: 'Field', name: { kind: 'Name', value: 'key' } }, + { kind: 'Field', name: { kind: 'Name', value: 'type' } }, + { kind: 'Field', name: { kind: 'Name', value: 'area' } }, + { kind: 'Field', name: { kind: 'Name', value: 'title' } }, + { kind: 'Field', name: { kind: 'Name', value: 'status' } }, + { kind: 'Field', name: { kind: 'Name', value: 'statusCategory' } }, + { kind: 'Field', name: { kind: 'Name', value: 'priority' } }, + { kind: 'Field', name: { kind: 'Name', value: 'labels' } }, + { kind: 'Field', name: { kind: 'Name', value: 'commentCount' } }, + { kind: 'Field', name: { kind: 'Name', value: 'updatedAt' } }, + { kind: 'Field', name: { kind: 'Name', value: 'version' } }, + { + kind: 'Field', + name: { kind: 'Name', value: 'assignee' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'UserRefFields' }, + }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'release' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'sprint' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'parent' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'key' } }, + { kind: 'Field', name: { kind: 'Name', value: 'title' } }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'blockedBy' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'key' } }, + { kind: 'Field', name: { kind: 'Name', value: 'title' } }, + ], + }, + }, + { kind: 'Field', name: { kind: 'Name', value: 'votes' } }, + { kind: 'Field', name: { kind: 'Name', value: 'voted' } }, + { kind: 'Field', name: { kind: 'Name', value: 'rank' } }, + { kind: 'Field', name: { kind: 'Name', value: 'storyPoints' } }, + { kind: 'Field', name: { kind: 'Name', value: 'startDate' } }, + { kind: 'Field', name: { kind: 'Name', value: 'dueDate' } }, + { kind: 'Field', name: { kind: 'Name', value: 'trashedAt' } }, + ], + }, + }, + ], +} as unknown as DocumentNode; +export const ReactToCommentDocument = { + kind: 'Document', + definitions: [ + { + kind: 'OperationDefinition', + operation: 'mutation', + name: { kind: 'Name', value: 'ReactToComment' }, + variableDefinitions: [ + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'commentId' }, + }, + type: { + kind: 'NonNullType', + type: { kind: 'NamedType', name: { kind: 'Name', value: 'ID' } }, + }, + }, + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'emoji' }, + }, + type: { + kind: 'NonNullType', + type: { + kind: 'NamedType', + name: { kind: 'Name', value: 'String' }, + }, + }, + }, + { + kind: 'VariableDefinition', + variable: { kind: 'Variable', name: { kind: 'Name', value: 'on' } }, + type: { + kind: 'NonNullType', + type: { + kind: 'NamedType', + name: { kind: 'Name', value: 'Boolean' }, + }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'reactToComment' }, + arguments: [ + { + kind: 'Argument', + name: { kind: 'Name', value: 'commentId' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'commentId' }, + }, + }, + { + kind: 'Argument', + name: { kind: 'Name', value: 'emoji' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'emoji' }, + }, + }, + { + kind: 'Argument', + name: { kind: 'Name', value: 'on' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'on' }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'CommandResultFields' }, + }, + ], + }, + }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'CommandResultFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'CommandResult' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'key' } }, + { kind: 'Field', name: { kind: 'Name', value: 'version' } }, + ], + }, + }, + ], +} as unknown as DocumentNode< + ReactToCommentMutation, + ReactToCommentMutationVariables +>; +export const DuplicateIssueDocument = { + kind: 'Document', + definitions: [ + { + kind: 'OperationDefinition', + operation: 'mutation', + name: { kind: 'Name', value: 'DuplicateIssue' }, + variableDefinitions: [ + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'issueId' }, + }, + type: { + kind: 'NonNullType', + type: { kind: 'NamedType', name: { kind: 'Name', value: 'ID' } }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'duplicateIssue' }, + arguments: [ + { + kind: 'Argument', + name: { kind: 'Name', value: 'issueId' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'issueId' }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'CommandResultFields' }, + }, + ], + }, + }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'CommandResultFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'CommandResult' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'key' } }, + { kind: 'Field', name: { kind: 'Name', value: 'version' } }, + ], + }, + }, + ], +} as unknown as DocumentNode< + DuplicateIssueMutation, + DuplicateIssueMutationVariables +>; +export const VoteIssueDocument = { + kind: 'Document', + definitions: [ + { + kind: 'OperationDefinition', + operation: 'mutation', + name: { kind: 'Name', value: 'VoteIssue' }, + variableDefinitions: [ + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'issueId' }, + }, + type: { + kind: 'NonNullType', + type: { kind: 'NamedType', name: { kind: 'Name', value: 'ID' } }, + }, + }, + { + kind: 'VariableDefinition', + variable: { kind: 'Variable', name: { kind: 'Name', value: 'on' } }, + type: { + kind: 'NonNullType', + type: { + kind: 'NamedType', + name: { kind: 'Name', value: 'Boolean' }, + }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'voteIssue' }, + arguments: [ + { + kind: 'Argument', + name: { kind: 'Name', value: 'issueId' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'issueId' }, + }, + }, + { + kind: 'Argument', + name: { kind: 'Name', value: 'on' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'on' }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'CommandResultFields' }, + }, + ], + }, + }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'CommandResultFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'CommandResult' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'key' } }, + { kind: 'Field', name: { kind: 'Name', value: 'version' } }, + ], + }, + }, + ], +} as unknown as DocumentNode; +export const MyNotificationsDocument = { + kind: 'Document', + definitions: [ + { + kind: 'OperationDefinition', + operation: 'query', + name: { kind: 'Name', value: 'MyNotifications' }, + variableDefinitions: [ + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'unreadOnly' }, + }, + type: { + kind: 'NonNullType', + type: { + kind: 'NamedType', + name: { kind: 'Name', value: 'Boolean' }, + }, + }, + }, + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'limit' }, + }, + type: { + kind: 'NonNullType', + type: { kind: 'NamedType', name: { kind: 'Name', value: 'Int' } }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'myNotifications' }, + arguments: [ + { + kind: 'Argument', + name: { kind: 'Name', value: 'unreadOnly' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'unreadOnly' }, + }, + }, + { + kind: 'Argument', + name: { kind: 'Name', value: 'limit' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'limit' }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'unread' } }, + { + kind: 'Field', + name: { kind: 'Name', value: 'items' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'NotificationFields' }, + }, + ], + }, + }, + ], + }, + }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'UserRefFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'UserRef' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'NotificationFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'Notification' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'kind' } }, + { kind: 'Field', name: { kind: 'Name', value: 'projectId' } }, + { kind: 'Field', name: { kind: 'Name', value: 'projectKey' } }, + { kind: 'Field', name: { kind: 'Name', value: 'issueId' } }, + { kind: 'Field', name: { kind: 'Name', value: 'issueKey' } }, + { kind: 'Field', name: { kind: 'Name', value: 'summary' } }, + { kind: 'Field', name: { kind: 'Name', value: 'readAt' } }, + { kind: 'Field', name: { kind: 'Name', value: 'createdAt' } }, + { + kind: 'Field', + name: { kind: 'Name', value: 'actor' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'UserRefFields' }, + }, + ], + }, + }, + ], + }, + }, + ], +} as unknown as DocumentNode< + MyNotificationsQuery, + MyNotificationsQueryVariables +>; +export const NotificationSettingsDocument = { + kind: 'Document', + definitions: [ + { + kind: 'OperationDefinition', + operation: 'query', + name: { kind: 'Name', value: 'NotificationSettings' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'notificationSettings' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'email' } }, + { + kind: 'Field', + name: { kind: 'Name', value: 'emailAvailable' }, + }, + ], + }, + }, + ], + }, + }, + ], +} as unknown as DocumentNode< + NotificationSettingsQuery, + NotificationSettingsQueryVariables +>; +export const MarkNotificationsReadDocument = { + kind: 'Document', + definitions: [ + { + kind: 'OperationDefinition', + operation: 'mutation', + name: { kind: 'Name', value: 'MarkNotificationsRead' }, + variableDefinitions: [ + { + kind: 'VariableDefinition', + variable: { kind: 'Variable', name: { kind: 'Name', value: 'ids' } }, + type: { + kind: 'ListType', + type: { + kind: 'NonNullType', + type: { kind: 'NamedType', name: { kind: 'Name', value: 'ID' } }, + }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'markNotificationsRead' }, + arguments: [ + { + kind: 'Argument', + name: { kind: 'Name', value: 'ids' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'ids' }, + }, + }, + ], + }, + ], + }, + }, + ], +} as unknown as DocumentNode< + MarkNotificationsReadMutation, + MarkNotificationsReadMutationVariables +>; +export const UpdateNotificationSettingsDocument = { + kind: 'Document', + definitions: [ + { + kind: 'OperationDefinition', + operation: 'mutation', + name: { kind: 'Name', value: 'UpdateNotificationSettings' }, + variableDefinitions: [ + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'email' }, + }, + type: { + kind: 'NonNullType', + type: { + kind: 'NamedType', + name: { kind: 'Name', value: 'Boolean' }, + }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'updateNotificationSettings' }, + arguments: [ + { + kind: 'Argument', + name: { kind: 'Name', value: 'email' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'email' }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'email' } }, + { + kind: 'Field', + name: { kind: 'Name', value: 'emailAvailable' }, + }, + ], + }, + }, + ], + }, + }, + ], +} as unknown as DocumentNode< + UpdateNotificationSettingsMutation, + UpdateNotificationSettingsMutationVariables +>; +export const NotificationAddedDocument = { + kind: 'Document', + definitions: [ + { + kind: 'OperationDefinition', + operation: 'subscription', + name: { kind: 'Name', value: 'NotificationAdded' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'notificationAdded' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'NotificationFields' }, + }, + ], + }, + }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'UserRefFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'UserRef' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'NotificationFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'Notification' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'kind' } }, + { kind: 'Field', name: { kind: 'Name', value: 'projectId' } }, + { kind: 'Field', name: { kind: 'Name', value: 'projectKey' } }, + { kind: 'Field', name: { kind: 'Name', value: 'issueId' } }, + { kind: 'Field', name: { kind: 'Name', value: 'issueKey' } }, + { kind: 'Field', name: { kind: 'Name', value: 'summary' } }, + { kind: 'Field', name: { kind: 'Name', value: 'readAt' } }, + { kind: 'Field', name: { kind: 'Name', value: 'createdAt' } }, + { + kind: 'Field', + name: { kind: 'Name', value: 'actor' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'UserRefFields' }, + }, + ], + }, + }, + ], + }, + }, + ], +} as unknown as DocumentNode< + NotificationAddedSubscription, + NotificationAddedSubscriptionVariables +>; +export const MyProjectsDocument = { + kind: 'Document', + definitions: [ + { + kind: 'OperationDefinition', + operation: 'query', + name: { kind: 'Name', value: 'MyProjects' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'myProjects' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'ProjectFields' }, + }, + ], + }, + }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'UserRefFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'UserRef' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'ProjectFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'Project' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'key' } }, + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, + { kind: 'Field', name: { kind: 'Name', value: 'description' } }, + { kind: 'Field', name: { kind: 'Name', value: 'isPublic' } }, + { kind: 'Field', name: { kind: 'Name', value: 'acceptsProposals' } }, + { kind: 'Field', name: { kind: 'Name', value: 'updatedAt' } }, + { kind: 'Field', name: { kind: 'Name', value: 'version' } }, + { + kind: 'Field', + name: { kind: 'Name', value: 'owner' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'UserRefFields' }, + }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'members' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'role' } }, + { + kind: 'Field', + name: { kind: 'Name', value: 'user' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'UserRefFields' }, + }, + ], + }, + }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'settings' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'statuses' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, + { + kind: 'Field', + name: { kind: 'Name', value: 'category' }, + }, + { kind: 'Field', name: { kind: 'Name', value: 'color' } }, + { + kind: 'Field', + name: { kind: 'Name', value: 'requiresReason' }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'archived' }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'wipLimit' }, + }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'transitions' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'from' } }, + { kind: 'Field', name: { kind: 'Name', value: 'to' } }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'issueTypes' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, + { kind: 'Field', name: { kind: 'Name', value: 'icon' } }, + { kind: 'Field', name: { kind: 'Name', value: 'color' } }, + { + kind: 'Field', + name: { kind: 'Name', value: 'archived' }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'template' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'description' }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'checklist' }, + }, + ], + }, + }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'areas' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, + { + kind: 'Field', + name: { kind: 'Name', value: 'archived' }, + }, + ], + }, + }, + ], + }, + }, + ], + }, + }, + ], +} as unknown as DocumentNode; +export const ProjectDocument = { + kind: 'Document', + definitions: [ + { + kind: 'OperationDefinition', + operation: 'query', + name: { kind: 'Name', value: 'Project' }, + variableDefinitions: [ + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'idOrKey' }, + }, + type: { + kind: 'NonNullType', + type: { + kind: 'NamedType', + name: { kind: 'Name', value: 'String' }, + }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'project' }, + arguments: [ + { + kind: 'Argument', + name: { kind: 'Name', value: 'idOrKey' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'idOrKey' }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'ProjectFields' }, + }, + ], + }, + }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'UserRefFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'UserRef' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'ProjectFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'Project' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'key' } }, + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, + { kind: 'Field', name: { kind: 'Name', value: 'description' } }, + { kind: 'Field', name: { kind: 'Name', value: 'isPublic' } }, + { kind: 'Field', name: { kind: 'Name', value: 'acceptsProposals' } }, + { kind: 'Field', name: { kind: 'Name', value: 'updatedAt' } }, + { kind: 'Field', name: { kind: 'Name', value: 'version' } }, + { + kind: 'Field', + name: { kind: 'Name', value: 'owner' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'UserRefFields' }, + }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'members' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'role' } }, + { + kind: 'Field', + name: { kind: 'Name', value: 'user' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'UserRefFields' }, + }, + ], + }, + }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'settings' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'statuses' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, + { + kind: 'Field', + name: { kind: 'Name', value: 'category' }, + }, + { kind: 'Field', name: { kind: 'Name', value: 'color' } }, + { + kind: 'Field', + name: { kind: 'Name', value: 'requiresReason' }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'archived' }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'wipLimit' }, + }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'transitions' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'from' } }, + { kind: 'Field', name: { kind: 'Name', value: 'to' } }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'issueTypes' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, + { kind: 'Field', name: { kind: 'Name', value: 'icon' } }, + { kind: 'Field', name: { kind: 'Name', value: 'color' } }, + { + kind: 'Field', + name: { kind: 'Name', value: 'archived' }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'template' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'description' }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'checklist' }, + }, + ], + }, + }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'areas' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, + { + kind: 'Field', + name: { kind: 'Name', value: 'archived' }, + }, + ], + }, + }, + ], + }, + }, + ], + }, + }, + ], +} as unknown as DocumentNode; +export const ProjectStatsDocument = { + kind: 'Document', + definitions: [ + { + kind: 'OperationDefinition', + operation: 'query', + name: { kind: 'Name', value: 'ProjectStats' }, + variableDefinitions: [ + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'idOrKey' }, + }, + type: { + kind: 'NonNullType', + type: { + kind: 'NamedType', + name: { kind: 'Name', value: 'String' }, + }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'project' }, + arguments: [ + { + kind: 'Argument', + name: { kind: 'Name', value: 'idOrKey' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'idOrKey' }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { + kind: 'Field', + name: { kind: 'Name', value: 'stats' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'total' } }, + { kind: 'Field', name: { kind: 'Name', value: 'open' } }, + { + kind: 'Field', + name: { kind: 'Name', value: 'byStatus' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'key' }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'count' }, + }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'byType' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'key' }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'count' }, + }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'byPriority' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'key' }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'count' }, + }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'byArea' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'key' }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'count' }, + }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'byAssignee' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'count' }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'user' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { + kind: 'Name', + value: 'UserRefFields', + }, + }, + ], + }, + }, + ], + }, + }, + ], + }, + }, + ], + }, + }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'UserRefFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'UserRef' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, + ], + }, + }, + ], +} as unknown as DocumentNode; +export const CreateProjectDocument = { + kind: 'Document', + definitions: [ + { + kind: 'OperationDefinition', + operation: 'mutation', + name: { kind: 'Name', value: 'CreateProject' }, + variableDefinitions: [ + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'input' }, + }, + type: { + kind: 'NonNullType', + type: { + kind: 'NamedType', + name: { kind: 'Name', value: 'CreateProjectInput' }, + }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'createProject' }, + arguments: [ + { + kind: 'Argument', + name: { kind: 'Name', value: 'input' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'input' }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'CommandResultFields' }, + }, + ], + }, + }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'CommandResultFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'CommandResult' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'key' } }, + { kind: 'Field', name: { kind: 'Name', value: 'version' } }, + ], + }, + }, + ], +} as unknown as DocumentNode< + CreateProjectMutation, + CreateProjectMutationVariables +>; +export const AddProjectMemberDocument = { + kind: 'Document', + definitions: [ + { + kind: 'OperationDefinition', + operation: 'mutation', + name: { kind: 'Name', value: 'AddProjectMember' }, + variableDefinitions: [ + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'input' }, + }, + type: { + kind: 'NonNullType', + type: { + kind: 'NamedType', + name: { kind: 'Name', value: 'ProjectMemberInput' }, + }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'addProjectMember' }, + arguments: [ + { + kind: 'Argument', + name: { kind: 'Name', value: 'input' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'input' }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'CommandResultFields' }, + }, + ], + }, + }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'CommandResultFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'CommandResult' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'key' } }, + { kind: 'Field', name: { kind: 'Name', value: 'version' } }, + ], + }, + }, + ], +} as unknown as DocumentNode< + AddProjectMemberMutation, + AddProjectMemberMutationVariables +>; +export const ChangeProjectMemberRoleDocument = { + kind: 'Document', + definitions: [ + { + kind: 'OperationDefinition', + operation: 'mutation', + name: { kind: 'Name', value: 'ChangeProjectMemberRole' }, + variableDefinitions: [ + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'input' }, + }, + type: { + kind: 'NonNullType', + type: { + kind: 'NamedType', + name: { kind: 'Name', value: 'ProjectMemberInput' }, + }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'changeProjectMemberRole' }, + arguments: [ + { + kind: 'Argument', + name: { kind: 'Name', value: 'input' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'input' }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'CommandResultFields' }, + }, + ], + }, + }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'CommandResultFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'CommandResult' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'key' } }, + { kind: 'Field', name: { kind: 'Name', value: 'version' } }, + ], + }, + }, + ], +} as unknown as DocumentNode< + ChangeProjectMemberRoleMutation, + ChangeProjectMemberRoleMutationVariables +>; +export const RemoveProjectMemberDocument = { + kind: 'Document', + definitions: [ + { + kind: 'OperationDefinition', + operation: 'mutation', + name: { kind: 'Name', value: 'RemoveProjectMember' }, + variableDefinitions: [ + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'projectId' }, + }, + type: { + kind: 'NonNullType', + type: { kind: 'NamedType', name: { kind: 'Name', value: 'ID' } }, + }, + }, + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'userId' }, + }, + type: { + kind: 'NonNullType', + type: { kind: 'NamedType', name: { kind: 'Name', value: 'ID' } }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'removeProjectMember' }, + arguments: [ + { + kind: 'Argument', + name: { kind: 'Name', value: 'projectId' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'projectId' }, + }, + }, + { + kind: 'Argument', + name: { kind: 'Name', value: 'userId' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'userId' }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'CommandResultFields' }, + }, + ], + }, + }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'CommandResultFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'CommandResult' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'key' } }, + { kind: 'Field', name: { kind: 'Name', value: 'version' } }, + ], + }, + }, + ], +} as unknown as DocumentNode< + RemoveProjectMemberMutation, + RemoveProjectMemberMutationVariables +>; +export const SearchUsersDocument = { + kind: 'Document', + definitions: [ + { + kind: 'OperationDefinition', + operation: 'query', + name: { kind: 'Name', value: 'SearchUsers' }, + variableDefinitions: [ + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'search' }, + }, + type: { + kind: 'NonNullType', + type: { + kind: 'NamedType', + name: { kind: 'Name', value: 'String' }, + }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'users' }, + arguments: [ + { + kind: 'Argument', + name: { kind: 'Name', value: 'search' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'search' }, + }, + }, + { + kind: 'Argument', + name: { kind: 'Name', value: 'limit' }, + value: { kind: 'IntValue', value: '20' }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, + { kind: 'Field', name: { kind: 'Name', value: 'email' } }, + ], + }, + }, + ], + }, + }, + ], +} as unknown as DocumentNode; +export const UpdateProjectSettingsDocument = { + kind: 'Document', + definitions: [ + { + kind: 'OperationDefinition', + operation: 'mutation', + name: { kind: 'Name', value: 'UpdateProjectSettings' }, + variableDefinitions: [ + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'projectId' }, + }, + type: { + kind: 'NonNullType', + type: { kind: 'NamedType', name: { kind: 'Name', value: 'ID' } }, + }, + }, + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'settings' }, + }, + type: { + kind: 'NonNullType', + type: { + kind: 'NamedType', + name: { kind: 'Name', value: 'ProjectSettingsInput' }, + }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'updateProjectSettings' }, + arguments: [ + { + kind: 'Argument', + name: { kind: 'Name', value: 'projectId' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'projectId' }, + }, + }, + { + kind: 'Argument', + name: { kind: 'Name', value: 'settings' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'settings' }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'CommandResultFields' }, + }, + ], + }, + }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'CommandResultFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'CommandResult' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'key' } }, + { kind: 'Field', name: { kind: 'Name', value: 'version' } }, + ], + }, + }, + ], +} as unknown as DocumentNode< + UpdateProjectSettingsMutation, + UpdateProjectSettingsMutationVariables +>; +export const ProjectAnalyticsDocument = { + kind: 'Document', + definitions: [ + { + kind: 'OperationDefinition', + operation: 'query', + name: { kind: 'Name', value: 'ProjectAnalytics' }, + variableDefinitions: [ + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'idOrKey' }, + }, + type: { + kind: 'NonNullType', + type: { + kind: 'NamedType', + name: { kind: 'Name', value: 'String' }, + }, + }, + }, + { + kind: 'VariableDefinition', + variable: { kind: 'Variable', name: { kind: 'Name', value: 'days' } }, + type: { + kind: 'NonNullType', + type: { kind: 'NamedType', name: { kind: 'Name', value: 'Int' } }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'project' }, + arguments: [ + { + kind: 'Argument', + name: { kind: 'Name', value: 'idOrKey' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'idOrKey' }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { + kind: 'Field', + name: { kind: 'Name', value: 'analytics' }, + arguments: [ + { + kind: 'Argument', + name: { kind: 'Name', value: 'days' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'days' }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'from' } }, + { kind: 'Field', name: { kind: 'Name', value: 'to' } }, + { + kind: 'Field', + name: { kind: 'Name', value: 'createdVsResolved' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'week' }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'created' }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'resolved' }, + }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'cumulativeFlow' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'dates' }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'series' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'status' }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'counts' }, + }, + ], + }, + }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'cycleTime' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'count' }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'averageDays' }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'p85Days' }, + }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'leadTime' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'count' }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'averageDays' }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'p85Days' }, + }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'throughput' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'week' }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'count' }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'user' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { + kind: 'Name', + value: 'UserRefFields', + }, + }, + ], + }, + }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'qa' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'passed' }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'failed' }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'failureRate' }, + }, + ], + }, + }, + ], + }, + }, + ], + }, + }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'UserRefFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'UserRef' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, + ], + }, + }, + ], +} as unknown as DocumentNode< + ProjectAnalyticsQuery, + ProjectAnalyticsQueryVariables +>; +export const PublicProjectsDocument = { + kind: 'Document', + definitions: [ + { + kind: 'OperationDefinition', + operation: 'query', + name: { kind: 'Name', value: 'PublicProjects' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'publicProjects' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'ProjectFields' }, + }, + ], + }, + }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'UserRefFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'UserRef' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'ProjectFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'Project' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'key' } }, + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, + { kind: 'Field', name: { kind: 'Name', value: 'description' } }, + { kind: 'Field', name: { kind: 'Name', value: 'isPublic' } }, + { kind: 'Field', name: { kind: 'Name', value: 'acceptsProposals' } }, + { kind: 'Field', name: { kind: 'Name', value: 'updatedAt' } }, + { kind: 'Field', name: { kind: 'Name', value: 'version' } }, + { + kind: 'Field', + name: { kind: 'Name', value: 'owner' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'UserRefFields' }, + }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'members' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'role' } }, + { + kind: 'Field', + name: { kind: 'Name', value: 'user' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'UserRefFields' }, + }, + ], + }, + }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'settings' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'statuses' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, + { + kind: 'Field', + name: { kind: 'Name', value: 'category' }, + }, + { kind: 'Field', name: { kind: 'Name', value: 'color' } }, + { + kind: 'Field', + name: { kind: 'Name', value: 'requiresReason' }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'archived' }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'wipLimit' }, + }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'transitions' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'from' } }, + { kind: 'Field', name: { kind: 'Name', value: 'to' } }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'issueTypes' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, + { kind: 'Field', name: { kind: 'Name', value: 'icon' } }, + { kind: 'Field', name: { kind: 'Name', value: 'color' } }, + { + kind: 'Field', + name: { kind: 'Name', value: 'archived' }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'template' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'description' }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'checklist' }, + }, + ], + }, + }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'areas' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, + { + kind: 'Field', + name: { kind: 'Name', value: 'archived' }, + }, + ], + }, + }, + ], + }, + }, + ], + }, + }, + ], +} as unknown as DocumentNode; +export const UpdateProjectDocument = { + kind: 'Document', + definitions: [ + { + kind: 'OperationDefinition', + operation: 'mutation', + name: { kind: 'Name', value: 'UpdateProject' }, + variableDefinitions: [ + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'input' }, + }, + type: { + kind: 'NonNullType', + type: { + kind: 'NamedType', + name: { kind: 'Name', value: 'UpdateProjectInput' }, + }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'updateProject' }, + arguments: [ + { + kind: 'Argument', + name: { kind: 'Name', value: 'input' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'input' }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'CommandResultFields' }, + }, + ], + }, + }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'CommandResultFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'CommandResult' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'key' } }, + { kind: 'Field', name: { kind: 'Name', value: 'version' } }, + ], + }, + }, + ], +} as unknown as DocumentNode< + UpdateProjectMutation, + UpdateProjectMutationVariables +>; +export const DeleteProjectDocument = { + kind: 'Document', + definitions: [ + { + kind: 'OperationDefinition', + operation: 'mutation', + name: { kind: 'Name', value: 'DeleteProject' }, + variableDefinitions: [ + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'projectId' }, + }, + type: { + kind: 'NonNullType', + type: { kind: 'NamedType', name: { kind: 'Name', value: 'ID' } }, + }, + }, + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'confirmKey' }, + }, + type: { + kind: 'NonNullType', + type: { + kind: 'NamedType', + name: { kind: 'Name', value: 'String' }, + }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'deleteProject' }, + arguments: [ + { + kind: 'Argument', + name: { kind: 'Name', value: 'projectId' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'projectId' }, + }, + }, + { + kind: 'Argument', + name: { kind: 'Name', value: 'confirmKey' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'confirmKey' }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'CommandResultFields' }, + }, + ], + }, + }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'CommandResultFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'CommandResult' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'key' } }, + { kind: 'Field', name: { kind: 'Name', value: 'version' } }, + ], + }, + }, + ], +} as unknown as DocumentNode< + DeleteProjectMutation, + DeleteProjectMutationVariables +>; +export const ReleasesDocument = { + kind: 'Document', + definitions: [ + { + kind: 'OperationDefinition', + operation: 'query', + name: { kind: 'Name', value: 'Releases' }, + variableDefinitions: [ + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'idOrKey' }, + }, + type: { + kind: 'NonNullType', + type: { + kind: 'NamedType', + name: { kind: 'Name', value: 'String' }, + }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'project' }, + arguments: [ + { + kind: 'Argument', + name: { kind: 'Name', value: 'idOrKey' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'idOrKey' }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { + kind: 'Field', + name: { kind: 'Name', value: 'releases' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'ReleaseFields' }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'progress' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'total' }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'finished' }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'percent' }, + }, + ], + }, + }, + ], + }, + }, + ], + }, + }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'ReleaseFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'Release' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'projectId' } }, + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, + { kind: 'Field', name: { kind: 'Name', value: 'description' } }, + { kind: 'Field', name: { kind: 'Name', value: 'targetDate' } }, + { kind: 'Field', name: { kind: 'Name', value: 'status' } }, + { kind: 'Field', name: { kind: 'Name', value: 'releasedAt' } }, + { kind: 'Field', name: { kind: 'Name', value: 'notes' } }, + ], + }, + }, + ], +} as unknown as DocumentNode; +export const CreateReleaseDocument = { + kind: 'Document', + definitions: [ + { + kind: 'OperationDefinition', + operation: 'mutation', + name: { kind: 'Name', value: 'CreateRelease' }, + variableDefinitions: [ + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'input' }, + }, + type: { + kind: 'NonNullType', + type: { + kind: 'NamedType', + name: { kind: 'Name', value: 'CreateReleaseInput' }, + }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'createRelease' }, + arguments: [ + { + kind: 'Argument', + name: { kind: 'Name', value: 'input' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'input' }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'CommandResultFields' }, + }, + ], + }, + }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'CommandResultFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'CommandResult' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'key' } }, + { kind: 'Field', name: { kind: 'Name', value: 'version' } }, + ], + }, + }, + ], +} as unknown as DocumentNode< + CreateReleaseMutation, + CreateReleaseMutationVariables +>; +export const PublishReleaseDocument = { + kind: 'Document', + definitions: [ + { + kind: 'OperationDefinition', + operation: 'mutation', + name: { kind: 'Name', value: 'PublishRelease' }, + variableDefinitions: [ + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'releaseId' }, + }, + type: { + kind: 'NonNullType', + type: { kind: 'NamedType', name: { kind: 'Name', value: 'ID' } }, + }, + }, + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'force' }, + }, + type: { + kind: 'NonNullType', + type: { + kind: 'NamedType', + name: { kind: 'Name', value: 'Boolean' }, + }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'publishRelease' }, + arguments: [ + { + kind: 'Argument', + name: { kind: 'Name', value: 'releaseId' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'releaseId' }, + }, + }, + { + kind: 'Argument', + name: { kind: 'Name', value: 'force' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'force' }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'CommandResultFields' }, + }, + ], + }, + }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'CommandResultFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'CommandResult' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'key' } }, + { kind: 'Field', name: { kind: 'Name', value: 'version' } }, + ], + }, + }, + ], +} as unknown as DocumentNode< + PublishReleaseMutation, + PublishReleaseMutationVariables +>; +export const ArchiveReleaseDocument = { + kind: 'Document', + definitions: [ + { + kind: 'OperationDefinition', + operation: 'mutation', + name: { kind: 'Name', value: 'ArchiveRelease' }, + variableDefinitions: [ + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'releaseId' }, + }, + type: { + kind: 'NonNullType', + type: { kind: 'NamedType', name: { kind: 'Name', value: 'ID' } }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'archiveRelease' }, + arguments: [ + { + kind: 'Argument', + name: { kind: 'Name', value: 'releaseId' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'releaseId' }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'CommandResultFields' }, + }, + ], + }, + }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'CommandResultFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'CommandResult' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'key' } }, + { kind: 'Field', name: { kind: 'Name', value: 'version' } }, + ], + }, + }, + ], +} as unknown as DocumentNode< + ArchiveReleaseMutation, + ArchiveReleaseMutationVariables +>; +export const ActivityDocument = { + kind: 'Document', + definitions: [ + { + kind: 'OperationDefinition', + operation: 'query', + name: { kind: 'Name', value: 'Activity' }, + variableDefinitions: [ + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'projectId' }, + }, + type: { + kind: 'NonNullType', + type: { kind: 'NamedType', name: { kind: 'Name', value: 'ID' } }, + }, + }, + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'issueId' }, + }, + type: { kind: 'NamedType', name: { kind: 'Name', value: 'ID' } }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'activity' }, + arguments: [ + { + kind: 'Argument', + name: { kind: 'Name', value: 'projectId' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'projectId' }, + }, + }, + { + kind: 'Argument', + name: { kind: 'Name', value: 'issueId' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'issueId' }, + }, + }, + { + kind: 'Argument', + name: { kind: 'Name', value: 'limit' }, + value: { kind: 'IntValue', value: '100' }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'ActivityFields' }, + }, + ], + }, + }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'UserRefFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'UserRef' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'ActivityFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'Activity' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'type' } }, + { kind: 'Field', name: { kind: 'Name', value: 'issueId' } }, + { kind: 'Field', name: { kind: 'Name', value: 'issueKey' } }, + { kind: 'Field', name: { kind: 'Name', value: 'summary' } }, + { kind: 'Field', name: { kind: 'Name', value: 'occurredAt' } }, + { + kind: 'Field', + name: { kind: 'Name', value: 'actor' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'UserRefFields' }, + }, + ], + }, + }, + ], + }, + }, + ], +} as unknown as DocumentNode; +export const UpcomingReleasesDocument = { + kind: 'Document', + definitions: [ + { + kind: 'OperationDefinition', + operation: 'query', + name: { kind: 'Name', value: 'UpcomingReleases' }, + variableDefinitions: [ + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'limit' }, + }, + type: { + kind: 'NonNullType', + type: { kind: 'NamedType', name: { kind: 'Name', value: 'Int' } }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'upcomingReleases' }, + arguments: [ + { + kind: 'Argument', + name: { kind: 'Name', value: 'limit' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'limit' }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'ReleaseFields' }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'progress' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'total' } }, + { + kind: 'Field', + name: { kind: 'Name', value: 'finished' }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'percent' }, + }, + ], + }, + }, + ], + }, + }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'ReleaseFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'Release' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'projectId' } }, + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, + { kind: 'Field', name: { kind: 'Name', value: 'description' } }, + { kind: 'Field', name: { kind: 'Name', value: 'targetDate' } }, + { kind: 'Field', name: { kind: 'Name', value: 'status' } }, + { kind: 'Field', name: { kind: 'Name', value: 'releasedAt' } }, + { kind: 'Field', name: { kind: 'Name', value: 'notes' } }, + ], + }, + }, + ], +} as unknown as DocumentNode< + UpcomingReleasesQuery, + UpcomingReleasesQueryVariables +>; +export const ReleaseBurnupDocument = { + kind: 'Document', + definitions: [ + { + kind: 'OperationDefinition', + operation: 'query', + name: { kind: 'Name', value: 'ReleaseBurnup' }, + variableDefinitions: [ + { + kind: 'VariableDefinition', + variable: { kind: 'Variable', name: { kind: 'Name', value: 'id' } }, + type: { + kind: 'NonNullType', + type: { kind: 'NamedType', name: { kind: 'Name', value: 'ID' } }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'release' }, + arguments: [ + { + kind: 'Argument', + name: { kind: 'Name', value: 'id' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'id' }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { + kind: 'Field', + name: { kind: 'Name', value: 'burnup' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'releaseId' }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'targetDate' }, + }, + { kind: 'Field', name: { kind: 'Name', value: 'dates' } }, + { kind: 'Field', name: { kind: 'Name', value: 'scope' } }, + { kind: 'Field', name: { kind: 'Name', value: 'done' } }, + ], + }, + }, + ], + }, + }, + ], + }, + }, + ], +} as unknown as DocumentNode; +export const ReleaseNotesDraftDocument = { + kind: 'Document', + definitions: [ + { + kind: 'OperationDefinition', + operation: 'query', + name: { kind: 'Name', value: 'ReleaseNotesDraft' }, + variableDefinitions: [ + { + kind: 'VariableDefinition', + variable: { kind: 'Variable', name: { kind: 'Name', value: 'id' } }, + type: { + kind: 'NonNullType', + type: { kind: 'NamedType', name: { kind: 'Name', value: 'ID' } }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'release' }, + arguments: [ + { + kind: 'Argument', + name: { kind: 'Name', value: 'id' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'id' }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'notesDraft' } }, + ], + }, + }, + ], + }, + }, + ], +} as unknown as DocumentNode< + ReleaseNotesDraftQuery, + ReleaseNotesDraftQueryVariables +>; +export const WriteReleaseNotesDocument = { + kind: 'Document', + definitions: [ + { + kind: 'OperationDefinition', + operation: 'mutation', + name: { kind: 'Name', value: 'WriteReleaseNotes' }, + variableDefinitions: [ + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'releaseId' }, + }, + type: { + kind: 'NonNullType', + type: { kind: 'NamedType', name: { kind: 'Name', value: 'ID' } }, + }, + }, + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'notes' }, + }, + type: { kind: 'NamedType', name: { kind: 'Name', value: 'String' } }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'writeReleaseNotes' }, + arguments: [ + { + kind: 'Argument', + name: { kind: 'Name', value: 'releaseId' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'releaseId' }, + }, + }, + { + kind: 'Argument', + name: { kind: 'Name', value: 'notes' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'notes' }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'CommandResultFields' }, + }, + ], + }, + }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'CommandResultFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'CommandResult' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'key' } }, + { kind: 'Field', name: { kind: 'Name', value: 'version' } }, + ], + }, + }, + ], +} as unknown as DocumentNode< + WriteReleaseNotesMutation, + WriteReleaseNotesMutationVariables +>; +export const SavedFiltersDocument = { + kind: 'Document', + definitions: [ + { + kind: 'OperationDefinition', + operation: 'query', + name: { kind: 'Name', value: 'SavedFilters' }, + variableDefinitions: [ + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'projectId' }, + }, + type: { + kind: 'NonNullType', + type: { kind: 'NamedType', name: { kind: 'Name', value: 'ID' } }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'savedFilters' }, + arguments: [ + { + kind: 'Argument', + name: { kind: 'Name', value: 'projectId' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'projectId' }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'SavedFilterFields' }, + }, + ], + }, + }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'UserRefFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'UserRef' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'SavedFilterFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'SavedFilter' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'projectId' } }, + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, + { kind: 'Field', name: { kind: 'Name', value: 'shared' } }, + { kind: 'Field', name: { kind: 'Name', value: 'createdAt' } }, + { + kind: 'Field', + name: { kind: 'Name', value: 'owner' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'UserRefFields' }, + }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'criteria' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'types' } }, + { kind: 'Field', name: { kind: 'Name', value: 'areas' } }, + { kind: 'Field', name: { kind: 'Name', value: 'priorities' } }, + { kind: 'Field', name: { kind: 'Name', value: 'assigneeId' } }, + { kind: 'Field', name: { kind: 'Name', value: 'unassigned' } }, + { kind: 'Field', name: { kind: 'Name', value: 'releaseId' } }, + { kind: 'Field', name: { kind: 'Name', value: 'labels' } }, + { kind: 'Field', name: { kind: 'Name', value: 'search' } }, + ], + }, + }, + ], + }, + }, + ], +} as unknown as DocumentNode; +export const SaveFilterDocument = { + kind: 'Document', + definitions: [ + { + kind: 'OperationDefinition', + operation: 'mutation', + name: { kind: 'Name', value: 'SaveFilter' }, + variableDefinitions: [ + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'input' }, + }, + type: { + kind: 'NonNullType', + type: { + kind: 'NamedType', + name: { kind: 'Name', value: 'SaveFilterInput' }, + }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'saveFilter' }, + arguments: [ + { + kind: 'Argument', + name: { kind: 'Name', value: 'input' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'input' }, + }, + }, + ], + }, + ], + }, + }, + ], +} as unknown as DocumentNode; +export const DeleteSavedFilterDocument = { + kind: 'Document', + definitions: [ + { + kind: 'OperationDefinition', + operation: 'mutation', + name: { kind: 'Name', value: 'DeleteSavedFilter' }, + variableDefinitions: [ + { + kind: 'VariableDefinition', + variable: { kind: 'Variable', name: { kind: 'Name', value: 'id' } }, + type: { + kind: 'NonNullType', + type: { kind: 'NamedType', name: { kind: 'Name', value: 'ID' } }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'deleteSavedFilter' }, + arguments: [ + { + kind: 'Argument', + name: { kind: 'Name', value: 'id' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'id' }, + }, + }, + ], + }, + ], + }, + }, + ], +} as unknown as DocumentNode< + DeleteSavedFilterMutation, + DeleteSavedFilterMutationVariables +>; +export const SprintsDocument = { + kind: 'Document', + definitions: [ + { + kind: 'OperationDefinition', + operation: 'query', + name: { kind: 'Name', value: 'Sprints' }, + variableDefinitions: [ + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'projectId' }, + }, + type: { + kind: 'NonNullType', + type: { kind: 'NamedType', name: { kind: 'Name', value: 'ID' } }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'sprints' }, + arguments: [ + { + kind: 'Argument', + name: { kind: 'Name', value: 'projectId' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'projectId' }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'SprintFields' }, + }, + ], + }, + }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'SprintFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'Sprint' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'projectId' } }, + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, + { kind: 'Field', name: { kind: 'Name', value: 'goal' } }, + { kind: 'Field', name: { kind: 'Name', value: 'startDate' } }, + { kind: 'Field', name: { kind: 'Name', value: 'endDate' } }, + { kind: 'Field', name: { kind: 'Name', value: 'status' } }, + { kind: 'Field', name: { kind: 'Name', value: 'startedAt' } }, + { kind: 'Field', name: { kind: 'Name', value: 'closedAt' } }, + { + kind: 'Field', + name: { kind: 'Name', value: 'progress' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'total' } }, + { kind: 'Field', name: { kind: 'Name', value: 'finished' } }, + { kind: 'Field', name: { kind: 'Name', value: 'percent' } }, + { kind: 'Field', name: { kind: 'Name', value: 'storyPoints' } }, + { + kind: 'Field', + name: { kind: 'Name', value: 'finishedStoryPoints' }, + }, + ], + }, + }, + ], + }, + }, + ], +} as unknown as DocumentNode; +export const SprintBurndownDocument = { + kind: 'Document', + definitions: [ + { + kind: 'OperationDefinition', + operation: 'query', + name: { kind: 'Name', value: 'SprintBurndown' }, + variableDefinitions: [ + { + kind: 'VariableDefinition', + variable: { kind: 'Variable', name: { kind: 'Name', value: 'id' } }, + type: { + kind: 'NonNullType', + type: { kind: 'NamedType', name: { kind: 'Name', value: 'ID' } }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'sprint' }, + arguments: [ + { + kind: 'Argument', + name: { kind: 'Name', value: 'id' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'id' }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { + kind: 'Field', + name: { kind: 'Name', value: 'burndown' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'sprintId' }, + }, + { kind: 'Field', name: { kind: 'Name', value: 'dates' } }, + { kind: 'Field', name: { kind: 'Name', value: 'scope' } }, + { + kind: 'Field', + name: { kind: 'Name', value: 'remaining' }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'remainingPoints' }, + }, + { kind: 'Field', name: { kind: 'Name', value: 'ideal' } }, + ], + }, + }, + ], + }, + }, + ], + }, + }, + ], +} as unknown as DocumentNode; +export const CreateSprintDocument = { + kind: 'Document', + definitions: [ + { + kind: 'OperationDefinition', + operation: 'mutation', + name: { kind: 'Name', value: 'CreateSprint' }, + variableDefinitions: [ + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'input' }, + }, + type: { + kind: 'NonNullType', + type: { + kind: 'NamedType', + name: { kind: 'Name', value: 'CreateSprintInput' }, + }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'createSprint' }, + arguments: [ + { + kind: 'Argument', + name: { kind: 'Name', value: 'input' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'input' }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'CommandResultFields' }, + }, + ], + }, + }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'CommandResultFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'CommandResult' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'key' } }, + { kind: 'Field', name: { kind: 'Name', value: 'version' } }, + ], + }, + }, + ], +} as unknown as DocumentNode< + CreateSprintMutation, + CreateSprintMutationVariables +>; +export const UpdateSprintDocument = { + kind: 'Document', + definitions: [ + { + kind: 'OperationDefinition', + operation: 'mutation', + name: { kind: 'Name', value: 'UpdateSprint' }, + variableDefinitions: [ + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'input' }, + }, + type: { + kind: 'NonNullType', + type: { + kind: 'NamedType', + name: { kind: 'Name', value: 'UpdateSprintInput' }, + }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'updateSprint' }, + arguments: [ + { + kind: 'Argument', + name: { kind: 'Name', value: 'input' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'input' }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'CommandResultFields' }, + }, + ], + }, + }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'CommandResultFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'CommandResult' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'key' } }, + { kind: 'Field', name: { kind: 'Name', value: 'version' } }, + ], + }, + }, + ], +} as unknown as DocumentNode< + UpdateSprintMutation, + UpdateSprintMutationVariables +>; +export const StartSprintDocument = { + kind: 'Document', + definitions: [ + { + kind: 'OperationDefinition', + operation: 'mutation', + name: { kind: 'Name', value: 'StartSprint' }, + variableDefinitions: [ + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'sprintId' }, + }, + type: { + kind: 'NonNullType', + type: { kind: 'NamedType', name: { kind: 'Name', value: 'ID' } }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'startSprint' }, + arguments: [ + { + kind: 'Argument', + name: { kind: 'Name', value: 'sprintId' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'sprintId' }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'CommandResultFields' }, + }, + ], + }, + }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'CommandResultFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'CommandResult' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'key' } }, + { kind: 'Field', name: { kind: 'Name', value: 'version' } }, + ], + }, + }, + ], +} as unknown as DocumentNode; +export const CloseSprintDocument = { + kind: 'Document', + definitions: [ + { + kind: 'OperationDefinition', + operation: 'mutation', + name: { kind: 'Name', value: 'CloseSprint' }, + variableDefinitions: [ + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'sprintId' }, + }, + type: { + kind: 'NonNullType', + type: { kind: 'NamedType', name: { kind: 'Name', value: 'ID' } }, + }, + }, + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'carryOverToSprintId' }, + }, + type: { kind: 'NamedType', name: { kind: 'Name', value: 'ID' } }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'closeSprint' }, + arguments: [ + { + kind: 'Argument', + name: { kind: 'Name', value: 'sprintId' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'sprintId' }, + }, + }, + { + kind: 'Argument', + name: { kind: 'Name', value: 'carryOverToSprintId' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'carryOverToSprintId' }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'CommandResultFields' }, + }, + ], + }, + }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'CommandResultFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'CommandResult' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'key' } }, + { kind: 'Field', name: { kind: 'Name', value: 'version' } }, + ], + }, + }, + ], +} as unknown as DocumentNode; +export const DeleteSprintDocument = { + kind: 'Document', + definitions: [ + { + kind: 'OperationDefinition', + operation: 'mutation', + name: { kind: 'Name', value: 'DeleteSprint' }, + variableDefinitions: [ + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'sprintId' }, + }, + type: { + kind: 'NonNullType', + type: { kind: 'NamedType', name: { kind: 'Name', value: 'ID' } }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'deleteSprint' }, + arguments: [ + { + kind: 'Argument', + name: { kind: 'Name', value: 'sprintId' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'sprintId' }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'CommandResultFields' }, + }, + ], + }, + }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'CommandResultFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'CommandResult' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'key' } }, + { kind: 'Field', name: { kind: 'Name', value: 'version' } }, + ], + }, + }, + ], +} as unknown as DocumentNode< + DeleteSprintMutation, + DeleteSprintMutationVariables +>; +export const SetIssueSprintDocument = { + kind: 'Document', + definitions: [ + { + kind: 'OperationDefinition', + operation: 'mutation', + name: { kind: 'Name', value: 'SetIssueSprint' }, + variableDefinitions: [ + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'issueId' }, + }, + type: { + kind: 'NonNullType', + type: { kind: 'NamedType', name: { kind: 'Name', value: 'ID' } }, + }, + }, + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'sprintId' }, + }, + type: { kind: 'NamedType', name: { kind: 'Name', value: 'ID' } }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'setIssueSprint' }, + arguments: [ + { + kind: 'Argument', + name: { kind: 'Name', value: 'issueId' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'issueId' }, + }, + }, + { + kind: 'Argument', + name: { kind: 'Name', value: 'sprintId' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'sprintId' }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'CommandResultFields' }, + }, + ], + }, + }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'CommandResultFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'CommandResult' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'key' } }, + { kind: 'Field', name: { kind: 'Name', value: 'version' } }, + ], + }, + }, + ], +} as unknown as DocumentNode< + SetIssueSprintMutation, + SetIssueSprintMutationVariables +>; +export const SprintChangedDocument = { + kind: 'Document', + definitions: [ + { + kind: 'OperationDefinition', + operation: 'subscription', + name: { kind: 'Name', value: 'SprintChanged' }, + variableDefinitions: [ + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'projectId' }, + }, + type: { + kind: 'NonNullType', + type: { kind: 'NamedType', name: { kind: 'Name', value: 'ID' } }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'sprintChanged' }, + arguments: [ + { + kind: 'Argument', + name: { kind: 'Name', value: 'projectId' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'projectId' }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'action' } }, + { kind: 'Field', name: { kind: 'Name', value: 'sprintId' } }, + ], + }, + }, + ], + }, + }, + ], +} as unknown as DocumentNode< + SprintChangedSubscription, + SprintChangedSubscriptionVariables +>; +export const IssueChangedDocument = { + kind: 'Document', + definitions: [ + { + kind: 'OperationDefinition', + operation: 'subscription', + name: { kind: 'Name', value: 'IssueChanged' }, + variableDefinitions: [ + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'projectId' }, + }, + type: { + kind: 'NonNullType', + type: { kind: 'NamedType', name: { kind: 'Name', value: 'ID' } }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'issueChanged' }, + arguments: [ + { + kind: 'Argument', + name: { kind: 'Name', value: 'projectId' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'projectId' }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'action' } }, + { kind: 'Field', name: { kind: 'Name', value: 'version' } }, + { kind: 'Field', name: { kind: 'Name', value: 'actorId' } }, + { + kind: 'Field', + name: { kind: 'Name', value: 'issue' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'IssueSummaryFields' }, + }, + ], + }, + }, + ], + }, + }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'UserRefFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'UserRef' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'IssueSummaryFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'Issue' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'projectId' } }, + { kind: 'Field', name: { kind: 'Name', value: 'key' } }, + { kind: 'Field', name: { kind: 'Name', value: 'type' } }, + { kind: 'Field', name: { kind: 'Name', value: 'area' } }, + { kind: 'Field', name: { kind: 'Name', value: 'title' } }, + { kind: 'Field', name: { kind: 'Name', value: 'status' } }, + { kind: 'Field', name: { kind: 'Name', value: 'statusCategory' } }, + { kind: 'Field', name: { kind: 'Name', value: 'priority' } }, + { kind: 'Field', name: { kind: 'Name', value: 'labels' } }, + { kind: 'Field', name: { kind: 'Name', value: 'commentCount' } }, + { kind: 'Field', name: { kind: 'Name', value: 'updatedAt' } }, + { kind: 'Field', name: { kind: 'Name', value: 'version' } }, + { + kind: 'Field', + name: { kind: 'Name', value: 'assignee' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'UserRefFields' }, + }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'release' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'sprint' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'parent' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'key' } }, + { kind: 'Field', name: { kind: 'Name', value: 'title' } }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'blockedBy' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'key' } }, + { kind: 'Field', name: { kind: 'Name', value: 'title' } }, + ], + }, + }, + { kind: 'Field', name: { kind: 'Name', value: 'votes' } }, + { kind: 'Field', name: { kind: 'Name', value: 'voted' } }, + { kind: 'Field', name: { kind: 'Name', value: 'rank' } }, + { kind: 'Field', name: { kind: 'Name', value: 'storyPoints' } }, + { kind: 'Field', name: { kind: 'Name', value: 'startDate' } }, + { kind: 'Field', name: { kind: 'Name', value: 'dueDate' } }, + { kind: 'Field', name: { kind: 'Name', value: 'trashedAt' } }, + ], + }, + }, + ], +} as unknown as DocumentNode< + IssueChangedSubscription, + IssueChangedSubscriptionVariables +>; +export const CommentChangedDocument = { + kind: 'Document', + definitions: [ + { + kind: 'OperationDefinition', + operation: 'subscription', + name: { kind: 'Name', value: 'CommentChanged' }, + variableDefinitions: [ + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'issueId' }, + }, + type: { + kind: 'NonNullType', + type: { kind: 'NamedType', name: { kind: 'Name', value: 'ID' } }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'commentChanged' }, + arguments: [ + { + kind: 'Argument', + name: { kind: 'Name', value: 'issueId' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'issueId' }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'action' } }, + { kind: 'Field', name: { kind: 'Name', value: 'commentId' } }, + { + kind: 'Field', + name: { kind: 'Name', value: 'comment' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'CommentFields' }, + }, + ], + }, + }, + ], + }, + }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'UserRefFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'UserRef' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'CommentFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'Comment' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'issueId' } }, + { kind: 'Field', name: { kind: 'Name', value: 'body' } }, + { kind: 'Field', name: { kind: 'Name', value: 'replyTo' } }, + { kind: 'Field', name: { kind: 'Name', value: 'deleted' } }, + { + kind: 'Field', + name: { kind: 'Name', value: 'reactions' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'emoji' } }, + { + kind: 'Field', + name: { kind: 'Name', value: 'users' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'UserRefFields' }, + }, + ], + }, + }, + ], + }, + }, + { kind: 'Field', name: { kind: 'Name', value: 'createdAt' } }, + { kind: 'Field', name: { kind: 'Name', value: 'editedAt' } }, + { + kind: 'Field', + name: { kind: 'Name', value: 'author' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'UserRefFields' }, + }, + ], + }, + }, + ], + }, + }, + ], +} as unknown as DocumentNode< + CommentChangedSubscription, + CommentChangedSubscriptionVariables +>; +export const ActivityAddedDocument = { + kind: 'Document', + definitions: [ + { + kind: 'OperationDefinition', + operation: 'subscription', + name: { kind: 'Name', value: 'ActivityAdded' }, + variableDefinitions: [ + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'projectId' }, + }, + type: { + kind: 'NonNullType', + type: { kind: 'NamedType', name: { kind: 'Name', value: 'ID' } }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'activityAdded' }, + arguments: [ + { + kind: 'Argument', + name: { kind: 'Name', value: 'projectId' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'projectId' }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'ActivityFields' }, + }, + ], + }, + }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'UserRefFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'UserRef' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'ActivityFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'Activity' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'type' } }, + { kind: 'Field', name: { kind: 'Name', value: 'issueId' } }, + { kind: 'Field', name: { kind: 'Name', value: 'issueKey' } }, + { kind: 'Field', name: { kind: 'Name', value: 'summary' } }, + { kind: 'Field', name: { kind: 'Name', value: 'occurredAt' } }, + { + kind: 'Field', + name: { kind: 'Name', value: 'actor' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'UserRefFields' }, + }, + ], + }, + }, + ], + }, + }, + ], +} as unknown as DocumentNode< + ActivityAddedSubscription, + ActivityAddedSubscriptionVariables +>; +export const ReleaseChangedDocument = { + kind: 'Document', + definitions: [ + { + kind: 'OperationDefinition', + operation: 'subscription', + name: { kind: 'Name', value: 'ReleaseChanged' }, + variableDefinitions: [ + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'projectId' }, + }, + type: { + kind: 'NonNullType', + type: { kind: 'NamedType', name: { kind: 'Name', value: 'ID' } }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'releaseChanged' }, + arguments: [ + { + kind: 'Argument', + name: { kind: 'Name', value: 'projectId' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'projectId' }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'release' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'ReleaseFields' }, + }, + ], + }, + }, + ], + }, + }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'ReleaseFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'Release' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'projectId' } }, + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, + { kind: 'Field', name: { kind: 'Name', value: 'description' } }, + { kind: 'Field', name: { kind: 'Name', value: 'targetDate' } }, + { kind: 'Field', name: { kind: 'Name', value: 'status' } }, + { kind: 'Field', name: { kind: 'Name', value: 'releasedAt' } }, + { kind: 'Field', name: { kind: 'Name', value: 'notes' } }, + ], + }, + }, + ], +} as unknown as DocumentNode< + ReleaseChangedSubscription, + ReleaseChangedSubscriptionVariables +>; +export const ProjectChangedDocument = { + kind: 'Document', + definitions: [ + { + kind: 'OperationDefinition', + operation: 'subscription', + name: { kind: 'Name', value: 'ProjectChanged' }, + variableDefinitions: [ + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'projectId' }, + }, + type: { + kind: 'NonNullType', + type: { kind: 'NamedType', name: { kind: 'Name', value: 'ID' } }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'projectChanged' }, + arguments: [ + { + kind: 'Argument', + name: { kind: 'Name', value: 'projectId' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'projectId' }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'action' } }, + { + kind: 'Field', + name: { kind: 'Name', value: 'project' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'ProjectFields' }, + }, + ], + }, + }, + ], + }, + }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'UserRefFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'UserRef' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'ProjectFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'Project' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'key' } }, + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, + { kind: 'Field', name: { kind: 'Name', value: 'description' } }, + { kind: 'Field', name: { kind: 'Name', value: 'isPublic' } }, + { kind: 'Field', name: { kind: 'Name', value: 'acceptsProposals' } }, + { kind: 'Field', name: { kind: 'Name', value: 'updatedAt' } }, + { kind: 'Field', name: { kind: 'Name', value: 'version' } }, + { + kind: 'Field', + name: { kind: 'Name', value: 'owner' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'UserRefFields' }, + }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'members' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'role' } }, + { + kind: 'Field', + name: { kind: 'Name', value: 'user' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'UserRefFields' }, + }, + ], + }, + }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'settings' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'statuses' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, + { + kind: 'Field', + name: { kind: 'Name', value: 'category' }, + }, + { kind: 'Field', name: { kind: 'Name', value: 'color' } }, + { + kind: 'Field', + name: { kind: 'Name', value: 'requiresReason' }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'archived' }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'wipLimit' }, + }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'transitions' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'from' } }, + { kind: 'Field', name: { kind: 'Name', value: 'to' } }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'issueTypes' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, + { kind: 'Field', name: { kind: 'Name', value: 'icon' } }, + { kind: 'Field', name: { kind: 'Name', value: 'color' } }, + { + kind: 'Field', + name: { kind: 'Name', value: 'archived' }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'template' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'description' }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'checklist' }, + }, + ], + }, + }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'areas' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, + { + kind: 'Field', + name: { kind: 'Name', value: 'archived' }, + }, + ], + }, + }, + ], + }, + }, + ], + }, + }, + ], +} as unknown as DocumentNode< + ProjectChangedSubscription, + ProjectChangedSubscriptionVariables +>; +export const MyProjectsChangedDocument = { + kind: 'Document', + definitions: [ + { + kind: 'OperationDefinition', + operation: 'subscription', + name: { kind: 'Name', value: 'MyProjectsChanged' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'myProjectsChanged' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'action' } }, + { + kind: 'Field', + name: { kind: 'Name', value: 'project' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'ProjectFields' }, + }, + ], + }, + }, + ], + }, + }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'UserRefFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'UserRef' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'ProjectFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'Project' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'key' } }, + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, + { kind: 'Field', name: { kind: 'Name', value: 'description' } }, + { kind: 'Field', name: { kind: 'Name', value: 'isPublic' } }, + { kind: 'Field', name: { kind: 'Name', value: 'acceptsProposals' } }, + { kind: 'Field', name: { kind: 'Name', value: 'updatedAt' } }, + { kind: 'Field', name: { kind: 'Name', value: 'version' } }, + { + kind: 'Field', + name: { kind: 'Name', value: 'owner' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'UserRefFields' }, + }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'members' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'role' } }, + { + kind: 'Field', + name: { kind: 'Name', value: 'user' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'UserRefFields' }, + }, + ], + }, + }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'settings' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'statuses' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, + { + kind: 'Field', + name: { kind: 'Name', value: 'category' }, + }, + { kind: 'Field', name: { kind: 'Name', value: 'color' } }, + { + kind: 'Field', + name: { kind: 'Name', value: 'requiresReason' }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'archived' }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'wipLimit' }, + }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'transitions' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'from' } }, + { kind: 'Field', name: { kind: 'Name', value: 'to' } }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'issueTypes' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, + { kind: 'Field', name: { kind: 'Name', value: 'icon' } }, + { kind: 'Field', name: { kind: 'Name', value: 'color' } }, + { + kind: 'Field', + name: { kind: 'Name', value: 'archived' }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'template' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'description' }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'checklist' }, + }, + ], + }, + }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'areas' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, + { + kind: 'Field', + name: { kind: 'Name', value: 'archived' }, + }, + ], + }, + }, + ], + }, + }, + ], + }, + }, + ], +} as unknown as DocumentNode< + MyProjectsChangedSubscription, + MyProjectsChangedSubscriptionVariables +>; +export const WebhooksDocument = { + kind: 'Document', + definitions: [ + { + kind: 'OperationDefinition', + operation: 'query', + name: { kind: 'Name', value: 'Webhooks' }, + variableDefinitions: [ + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'projectId' }, + }, + type: { + kind: 'NonNullType', + type: { kind: 'NamedType', name: { kind: 'Name', value: 'ID' } }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'webhooks' }, + arguments: [ + { + kind: 'Argument', + name: { kind: 'Name', value: 'projectId' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'projectId' }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'WebhookFields' }, + }, + ], + }, + }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'UserRefFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'UserRef' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'WebhookDeliveryFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'WebhookDelivery' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'at' } }, + { kind: 'Field', name: { kind: 'Name', value: 'event' } }, + { kind: 'Field', name: { kind: 'Name', value: 'status' } }, + { kind: 'Field', name: { kind: 'Name', value: 'ok' } }, + { kind: 'Field', name: { kind: 'Name', value: 'error' } }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'WebhookFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'Webhook' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'url' } }, + { kind: 'Field', name: { kind: 'Name', value: 'events' } }, + { kind: 'Field', name: { kind: 'Name', value: 'active' } }, + { kind: 'Field', name: { kind: 'Name', value: 'createdAt' } }, + { + kind: 'Field', + name: { kind: 'Name', value: 'createdBy' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'UserRefFields' }, + }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'lastDelivery' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'WebhookDeliveryFields' }, + }, + ], + }, + }, + ], + }, + }, + ], +} as unknown as DocumentNode; +export const WebhookEventsDocument = { + kind: 'Document', + definitions: [ + { + kind: 'OperationDefinition', + operation: 'query', + name: { kind: 'Name', value: 'WebhookEvents' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'webhookEvents' } }, + ], + }, + }, + ], +} as unknown as DocumentNode; +export const CreateWebhookDocument = { + kind: 'Document', + definitions: [ + { + kind: 'OperationDefinition', + operation: 'mutation', + name: { kind: 'Name', value: 'CreateWebhook' }, + variableDefinitions: [ + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'input' }, + }, + type: { + kind: 'NonNullType', + type: { + kind: 'NamedType', + name: { kind: 'Name', value: 'CreateWebhookInput' }, + }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'createWebhook' }, + arguments: [ + { + kind: 'Argument', + name: { kind: 'Name', value: 'input' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'input' }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'secret' } }, + ], + }, + }, + ], + }, + }, + ], +} as unknown as DocumentNode< + CreateWebhookMutation, + CreateWebhookMutationVariables +>; +export const UpdateWebhookDocument = { + kind: 'Document', + definitions: [ + { + kind: 'OperationDefinition', + operation: 'mutation', + name: { kind: 'Name', value: 'UpdateWebhook' }, + variableDefinitions: [ + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'input' }, + }, + type: { + kind: 'NonNullType', + type: { + kind: 'NamedType', + name: { kind: 'Name', value: 'UpdateWebhookInput' }, + }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'updateWebhook' }, + arguments: [ + { + kind: 'Argument', + name: { kind: 'Name', value: 'input' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'input' }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'WebhookFields' }, + }, + ], + }, + }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'UserRefFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'UserRef' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'WebhookDeliveryFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'WebhookDelivery' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'at' } }, + { kind: 'Field', name: { kind: 'Name', value: 'event' } }, + { kind: 'Field', name: { kind: 'Name', value: 'status' } }, + { kind: 'Field', name: { kind: 'Name', value: 'ok' } }, + { kind: 'Field', name: { kind: 'Name', value: 'error' } }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'WebhookFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'Webhook' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'url' } }, + { kind: 'Field', name: { kind: 'Name', value: 'events' } }, + { kind: 'Field', name: { kind: 'Name', value: 'active' } }, + { kind: 'Field', name: { kind: 'Name', value: 'createdAt' } }, + { + kind: 'Field', + name: { kind: 'Name', value: 'createdBy' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'UserRefFields' }, + }, + ], + }, + }, + { + kind: 'Field', + name: { kind: 'Name', value: 'lastDelivery' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'WebhookDeliveryFields' }, + }, + ], + }, + }, + ], + }, + }, + ], +} as unknown as DocumentNode< + UpdateWebhookMutation, + UpdateWebhookMutationVariables +>; +export const DeleteWebhookDocument = { + kind: 'Document', + definitions: [ + { + kind: 'OperationDefinition', + operation: 'mutation', + name: { kind: 'Name', value: 'DeleteWebhook' }, + variableDefinitions: [ + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'webhookId' }, + }, + type: { + kind: 'NonNullType', + type: { kind: 'NamedType', name: { kind: 'Name', value: 'ID' } }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'deleteWebhook' }, + arguments: [ + { + kind: 'Argument', + name: { kind: 'Name', value: 'webhookId' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'webhookId' }, + }, + }, + ], + }, + ], + }, + }, + ], +} as unknown as DocumentNode< + DeleteWebhookMutation, + DeleteWebhookMutationVariables +>; +export const TestWebhookDocument = { + kind: 'Document', + definitions: [ + { + kind: 'OperationDefinition', + operation: 'mutation', + name: { kind: 'Name', value: 'TestWebhook' }, + variableDefinitions: [ + { + kind: 'VariableDefinition', + variable: { + kind: 'Variable', + name: { kind: 'Name', value: 'webhookId' }, + }, + type: { + kind: 'NonNullType', + type: { kind: 'NamedType', name: { kind: 'Name', value: 'ID' } }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'testWebhook' }, + arguments: [ + { + kind: 'Argument', + name: { kind: 'Name', value: 'webhookId' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'webhookId' }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'FragmentSpread', + name: { kind: 'Name', value: 'WebhookDeliveryFields' }, + }, + ], + }, + }, + ], + }, + }, + { + kind: 'FragmentDefinition', + name: { kind: 'Name', value: 'WebhookDeliveryFields' }, + typeCondition: { + kind: 'NamedType', + name: { kind: 'Name', value: 'WebhookDelivery' }, + }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'at' } }, + { kind: 'Field', name: { kind: 'Name', value: 'event' } }, + { kind: 'Field', name: { kind: 'Name', value: 'status' } }, + { kind: 'Field', name: { kind: 'Name', value: 'ok' } }, + { kind: 'Field', name: { kind: 'Name', value: 'error' } }, + ], + }, + }, + ], +} as unknown as DocumentNode; diff --git a/libs/web/tracker/infrastructure/src/lib/graphql/issues.graphql b/libs/web/tracker/infrastructure/src/lib/graphql/issues.graphql index 042eeac..aa9ea6f 100644 --- a/libs/web/tracker/infrastructure/src/lib/graphql/issues.graphql +++ b/libs/web/tracker/infrastructure/src/lib/graphql/issues.graphql @@ -249,3 +249,30 @@ query DueIssues($filter: IssueFilterInput!) { } } } + +query IssueList($filter: IssueFilterInput!, $limit: Int!) { + issues(filter: $filter, limit: $limit) { + items { + ...IssueSummaryFields + } + total + } +} + +mutation ReactToComment($commentId: ID!, $emoji: String!, $on: Boolean!) { + reactToComment(commentId: $commentId, emoji: $emoji, on: $on) { + ...CommandResultFields + } +} + +mutation DuplicateIssue($issueId: ID!) { + duplicateIssue(issueId: $issueId) { + ...CommandResultFields + } +} + +mutation VoteIssue($issueId: ID!, $on: Boolean!) { + voteIssue(issueId: $issueId, on: $on) { + ...CommandResultFields + } +} diff --git a/libs/web/tracker/infrastructure/src/lib/tracker-infrastructure.providers.ts b/libs/web/tracker/infrastructure/src/lib/tracker-infrastructure.providers.ts index 462d63d..0284b9d 100644 --- a/libs/web/tracker/infrastructure/src/lib/tracker-infrastructure.providers.ts +++ b/libs/web/tracker/infrastructure/src/lib/tracker-infrastructure.providers.ts @@ -5,6 +5,7 @@ import { import { ActivityGateway, AttachmentsGateway, + ProposalsGateway, CommentsGateway, IssuesGateway, NotificationsGateway, @@ -28,6 +29,7 @@ import { import { GraphqlIssuesGateway } from './adapters/graphql-issues.gateway'; import { GraphqlNotificationsGateway } from './adapters/graphql-notifications.gateway'; import { HttpAttachmentsGateway } from './adapters/http-attachments.gateway'; +import { HttpProposalsGateway } from './adapters/http-proposals.gateway'; import { GraphqlProjectsGateway } from './adapters/graphql-projects.gateway'; import { GraphqlRealtimeGateway } from './adapters/graphql-realtime.gateway'; import { GraphqlSavedFiltersGateway } from './adapters/graphql-saved-filters.gateway'; @@ -46,6 +48,7 @@ export function provideTrackerInfrastructure(): EnvironmentProviders { { provide: ReleasesGateway, useClass: GraphqlReleasesGateway }, { provide: ActivityGateway, useClass: GraphqlActivityGateway }, { provide: AttachmentsGateway, useClass: HttpAttachmentsGateway }, + { provide: ProposalsGateway, useClass: HttpProposalsGateway }, { provide: UsersGateway, useClass: GraphqlUsersGateway }, { provide: NotificationsGateway, useClass: GraphqlNotificationsGateway }, { provide: TrackerRealtimeGateway, useClass: GraphqlRealtimeGateway }, diff --git a/libs/web/tracker/presenters/project.json b/libs/web/tracker/presenters/project.json index a025cf2..c2aae5f 100644 --- a/libs/web/tracker/presenters/project.json +++ b/libs/web/tracker/presenters/project.json @@ -6,6 +6,13 @@ "projectType": "library", "tags": ["scope:web-tracker", "type:presenters"], "targets": { + "test": { + "executor": "@nx/vitest:test", + "outputs": ["{options.reportsDirectory}"], + "options": { + "reportsDirectory": "coverage/libs/web/tracker/presenters" + } + }, "lint": { "executor": "@nx/eslint:lint" } diff --git a/libs/web/tracker/presenters/src/lib/pages/backlog.page.ts b/libs/web/tracker/presenters/src/lib/pages/backlog.page.ts index 4fb8f84..e9b39a1 100644 --- a/libs/web/tracker/presenters/src/lib/pages/backlog.page.ts +++ b/libs/web/tracker/presenters/src/lib/pages/backlog.page.ts @@ -10,15 +10,11 @@ import { } from '@angular/core'; import { RouterLink } from '@angular/router'; import { - PiActionButtonComponent, PiEmptyStateComponent, PiIconButtonComponent, PiIconComponent, PiNoteComponent, - PiSelectFieldComponent, PiSkeletonComponent, - PiTextFieldComponent, - type PiSelectFieldOption, } from '@pi/ui'; import { BacklogFacade, @@ -27,31 +23,26 @@ import { } from '@task-stream/web/tracker/application'; import { BulkChange, - IssuePriority, IssueSummary, sumPoints, } from '@task-stream/web/tracker/domain'; -import { initials, options, PRIORITY, statusLook, typeLook } from '../ui/copy'; - -/** "Nobody" / "no sprint" in the bulk selects. */ -const NOBODY = '__none__'; +import { BulkBarComponent } from '../ui/bulk-bar'; +import { initials, PRIORITY, statusLook, typeLook } from '../ui/copy'; /** /p/:key/backlog — what is still to start, in the order the team takes it. */ @Component({ selector: 'ts-backlog-page', changeDetection: ChangeDetectionStrategy.OnPush, imports: [ + BulkBarComponent, RouterLink, CdkDrag, CdkDropList, - PiActionButtonComponent, PiEmptyStateComponent, PiIconButtonComponent, PiIconComponent, PiNoteComponent, - PiSelectFieldComponent, PiSkeletonComponent, - PiTextFieldComponent, ], providers: [provideBacklogFacade()], template: ` @@ -85,60 +76,12 @@ const NOBODY = '__none__'; } @else if (facade.issues().length) { @if (project.canContribute()) { - + }
    0 && this.facade.issues().every((i) => this.selected().has(i.id)), ); - protected readonly bulkFields: PiSelectFieldOption[] = [ - { value: 'status', label: 'Mover a…' }, - { value: 'assignee', label: 'Asignar a…' }, - { value: 'sprint', label: 'Sprint…' }, - { value: 'priority', label: 'Prioridad…' }, - { value: 'label', label: 'Añadir etiqueta…' }, - ]; - protected readonly bulkField = signal('status'); - protected readonly bulkValue = signal(null); - protected readonly bulkLabel = signal(''); - protected readonly statusOptions = computed[]>( - () => - this.project - .workflow() - .settings.statuses.filter((s) => !s.archived) - .map((s) => ({ value: s.id, label: s.name })), - ); - protected readonly assigneeOptions = computed[]>( - () => [ - { value: NOBODY, label: 'Nadie (sin asignar)' }, - ...this.project - .members() - .map((m) => ({ value: m.user.id, label: m.user.name })), - ], - ); - protected readonly sprintOptions = computed[]>( - () => [ - { value: NOBODY, label: 'Backlog (sin sprint)' }, - ...this.project - .openSprints() - .map((s) => ({ value: s.id, label: s.name })), - ], - ); - protected readonly priorityOptions = options(PRIORITY); - protected readonly canApply = computed(() => - this.bulkField() === 'label' - ? !!this.bulkLabel().trim() - : !!this.bulkValue(), - ); - protected toggle(issueId: string, on: boolean): void { this.selected.update((set) => { const next = new Set(set); @@ -395,29 +281,9 @@ export class BacklogPage { this.selected.set(new Set(on ? this.facade.issues().map((i) => i.id) : [])); } - protected applyBulk(): void { - const value = this.bulkValue(); - const change: BulkChange = {}; - switch (this.bulkField()) { - case 'status': - if (value) change.status = value; - break; - case 'assignee': - change.assigneeId = value === NOBODY ? null : value; - break; - case 'sprint': - change.sprintId = value === NOBODY ? null : value; - break; - case 'priority': - if (value) change.priority = value as IssuePriority; - break; - case 'label': - change.addLabels = [this.bulkLabel().trim().toLowerCase()]; - break; - } + protected applyBulk(change: BulkChange): void { this.facade.bulkUpdate([...this.selected()], change); this.selected.set(new Set()); - this.bulkLabel.set(''); } protected readonly points = computed(() => sumPoints(this.facade.issues())); protected readonly unestimated = computed( diff --git a/libs/web/tracker/presenters/src/lib/pages/issue.page.scss b/libs/web/tracker/presenters/src/lib/pages/issue.page.scss index d351991..13e8a41 100644 --- a/libs/web/tracker/presenters/src/lib/pages/issue.page.scss +++ b/libs/web/tracker/presenters/src/lib/pages/issue.page.scss @@ -445,18 +445,6 @@ a.ts-key { margin: 0.5rem 0; } -.ts-mention { - padding: 0 0.2em; - border-radius: 0.25em; - background: color-mix(in oklab, var(--ts-brand) 14%, transparent); - color: inherit; - font-weight: 600; -} - -.ts-mention.is-me { - background: color-mix(in oklab, var(--ts-brand) 30%, transparent); -} - .ts-mentions { display: flex; flex-wrap: wrap; @@ -573,3 +561,107 @@ a.ts-key { gap: 0.75rem; align-items: center; } + +// Waiting for other tickets: shown next to the key, with links to them. +.ts-blocked { + display: inline-flex; + flex-wrap: wrap; + gap: 0.375rem; + align-items: center; + padding: 0.125rem 0.5rem; + border-radius: 999px; + background: color-mix(in srgb, var(--ts-c-red, #d33) 12%, transparent); + color: var(--ts-c-red, var(--ts-ink)); + font-size: 0.8125rem; + font-weight: 600; + .ts-key { + color: inherit; + } +} + +// 👍 2 · 🎉 1 · (+) +.ts-reactions { + display: flex; + flex-wrap: wrap; + gap: 0.375rem; + align-items: center; + margin-top: 0.5rem; +} +.ts-reaction { + display: inline-flex; + gap: 0.25rem; + align-items: center; + // @pi/ui styles every } - } -

    + @if (project.myRole()) { +
    + + + +
    + @for (emoji of reactions; track emoji) { + + } +
    +
    + } + } @if (!comment.deleted && filesOf(comment).length) {
    @@ -593,12 +694,18 @@ const MAX_FILE_BYTES = 25 * 1024 * 1024; @for (thread of threads(); track thread.comment.id) {
    @for (reply of thread.replies; track reply.id) { } @if (replyingTo() === thread.comment.id) { @@ -614,6 +721,13 @@ const MAX_FILE_BYTES = 25 * 1024 * 1024; '… Escribe @ para mencionar a alguien.' " [(value)]="replyBody" + [tsPasteImages]="pasteImage" + /> + @if (replyMentionOptions().length) {
    - @for (member of replyMentionOptions(); track member.id) { + @for ( + member of replyMentionOptions(); + track member.id + ) { } @@ -651,7 +770,9 @@ const MAX_FILE_BYTES = 25 * 1024 * 1024;
    - } @else if (project.canContribute() && !thread.comment.deleted) { + } @else if ( + project.canContribute() && !thread.comment.deleted + ) { +
    + } @else { +
    +

    Cuéntanoslo

    +

    + No hace falta cuenta. Llegará al equipo como un ticket con la + etiqueta «propuesta», visible para todo el mundo (no escribas + datos personales). +

    +
    +
    +
    + ¿Qué es? + + +
    + + Título + + + Detalles + + + + Tu nombre o alias + + + + @if (error(); as message) { + + } +
    + +
    + + } + + } + `, + styles: ` + .ts-propose { + display: grid; + gap: 1rem; + max-width: 44rem; + padding: 1.5rem; + h2 { + margin: 0 0 0.25rem; + } + header p { + margin: 0; + } + } + .ts-propose__form { + display: grid; + gap: 1.5rem; + } + .ts-propose__kind { + display: flex; + flex-wrap: wrap; + gap: 0.5rem 1.25rem; + margin: 0; + padding: 0; + border: 0; + legend { + margin-bottom: 0.375rem; + font-size: 0.875rem; + font-weight: 600; + } + label { + display: inline-flex; + gap: 0.375rem; + align-items: center; + } + } + .ts-propose__trap { + position: absolute; + left: -10000px; + width: 1px; + height: 1px; + opacity: 0; + } + .ts-propose__error { + margin: 0; + color: var(--ts-c-red, var(--ts-ink)); + } + .ts-propose__done p { + margin: 0 0 0.75rem; + } + `, +}) +export class ProposePage { + protected readonly project = inject(ProjectFacade); + private readonly propose = inject(ProposeFacade); + + protected readonly kind = signal<'BUG' | 'IDEA'>('BUG'); + protected readonly title = signal(''); + protected readonly description = signal(''); + protected readonly author = signal(''); + protected readonly website = signal(''); + protected readonly sending = signal(false); + protected readonly error = signal(null); + protected readonly sent = signal(null); + protected readonly canSend = computed(() => { + const title = this.title().trim().length; + return title >= 3 && title <= 150; + }); + + protected submit(projectKey: string): void { + if (!this.canSend() || this.sending()) return; + this.sending.set(true); + this.error.set(null); + this.propose + .submit(projectKey, { + kind: this.kind(), + title: this.title().trim(), + description: this.description(), + author: this.author(), + website: this.website(), + }) + .subscribe({ + next: (result) => { + this.sending.set(false); + this.sent.set(result); + }, + error: (error: { status?: number }) => { + this.sending.set(false); + this.error.set( + error.status === 429 + ? 'Has enviado varias seguidas: espera unos minutos y vuelve a intentarlo.' + : 'No se ha podido enviar. Inténtalo de nuevo en un momento.', + ); + }, + }); + } + + protected reset(): void { + this.sent.set(null); + this.title.set(''); + this.description.set(''); + } +} diff --git a/libs/web/tracker/presenters/src/lib/pages/releases.page.ts b/libs/web/tracker/presenters/src/lib/pages/releases.page.ts index ab6b649..abccb5d 100644 --- a/libs/web/tracker/presenters/src/lib/pages/releases.page.ts +++ b/libs/web/tracker/presenters/src/lib/pages/releases.page.ts @@ -9,6 +9,7 @@ import { } from '@angular/core'; import { form, FormField, maxLength, required } from '@angular/forms/signals'; import { RouterLink } from '@angular/router'; +import { MarkdownComponent } from '../ui/markdown'; import { PiActionButtonComponent, PiEmptyStateComponent, @@ -26,6 +27,7 @@ import { RELEASE_STATUS, releaseWhen } from '../ui/copy'; selector: 'ts-releases-page', changeDetection: ChangeDetectionStrategy.OnPush, imports: [ + MarkdownComponent, RouterLink, FormField, PiActionButtonComponent, @@ -88,7 +90,10 @@ import { RELEASE_STATUS, releaseWhen } from '../ui/copy'; @if (release.notes) {
    Notas de la versión -
    {{ release.notes }}
    +
    }
    @@ -209,8 +214,8 @@ import { RELEASE_STATUS, releaseWhen } from '../ui/copy'; } } .ts-release__notes-text { + display: block; margin: 0.5rem 0 0; - white-space: pre-wrap; font: inherit; font-size: 0.875rem; } diff --git a/libs/web/tracker/presenters/src/lib/pages/roadmap.page.ts b/libs/web/tracker/presenters/src/lib/pages/roadmap.page.ts index 2330072..30dd5e1 100644 --- a/libs/web/tracker/presenters/src/lib/pages/roadmap.page.ts +++ b/libs/web/tracker/presenters/src/lib/pages/roadmap.page.ts @@ -1,3 +1,5 @@ +import { AuthFacade } from '@task-stream/web/identity/application'; +import { VoteComponent } from '../ui/vote'; import { ChangeDetectionStrategy, Component, @@ -42,7 +44,7 @@ const shortDay = (day: string) => @Component({ selector: 'ts-roadmap-page', changeDetection: ChangeDetectionStrategy.OnPush, - imports: [RouterLink, PiNoteComponent, PiSkeletonComponent], + imports: [RouterLink, PiNoteComponent, PiSkeletonComponent, VoteComponent], providers: [provideEpicsFacade()], template: `
    @@ -121,14 +123,21 @@ const shortDay = (day: string) => @for (row of epicRows(); track row.epic.issue.id) {
    > {{ epic.issue.title }} {{ epic.progress.percent }}% + } @@ -176,7 +191,7 @@ const shortDay = (day: string) => `, styles: ` .ts-roadmap { - --label: 14rem; + --label: 18rem; position: relative; display: grid; padding: 0.5rem 0.75rem 0.75rem; @@ -201,6 +216,23 @@ const shortDay = (day: string) => text-overflow: ellipsis; white-space: nowrap; } + .ts-roadmap__label--epic { + display: flex; + gap: 0.5rem; + align-items: center; + a { + flex: 1; + min-width: 0; + overflow: hidden; + color: inherit; + text-decoration: none; + text-overflow: ellipsis; + white-space: nowrap; + &:hover { + color: var(--ts-brand); + } + } + } a.ts-roadmap__label:hover { color: var(--ts-brand); } @@ -299,6 +331,13 @@ const shortDay = (day: string) => export class RoadmapPage { protected readonly epics = inject(EpicsFacade); private readonly project = inject(ProjectFacade); + private readonly auth = inject(AuthFacade); + /** Signed in, on a public project or as a member. */ + protected readonly canVote = computed( + () => + this.auth.isAuthenticated() && + (!!this.project.project()?.isPublic || !!this.project.myRole()), + ); private readonly dated = computed(() => this.epics.epics().filter((e) => e.issue.startDate || e.issue.dueDate), diff --git a/libs/web/tracker/presenters/src/lib/pages/settings.page.ts b/libs/web/tracker/presenters/src/lib/pages/settings.page.ts index 4684fe4..6805329 100644 --- a/libs/web/tracker/presenters/src/lib/pages/settings.page.ts +++ b/libs/web/tracker/presenters/src/lib/pages/settings.page.ts @@ -1,3 +1,4 @@ +import { RouterLink } from '@angular/router'; import { CdkDrag, CdkDragDrop, @@ -56,6 +57,7 @@ function idFrom(name: string): string { selector: 'ts-settings-page', changeDetection: ChangeDetectionStrategy.OnPush, imports: [ + RouterLink, GitIntegrationComponent, WebhooksComponent, TransferComponent, @@ -119,6 +121,44 @@ function idFrom(name: string): string { {{ project.isPublic ? 'Público' : 'Privado' }} + +
    +
    +

    Propuestas del público

    +

    + @if (!project.isPublic) { + Solo para proyectos públicos: hazlo público para abrir un + formulario donde cualquiera, sin cuenta, reporte un error o + proponga una idea. + } @else if (project.acceptsProposals) { + Abierto: cualquiera puede enviar un error o una idea desde + el formulario. Llegan como tickets con la etiqueta «propuesta», y se pueden + votar. + } @else { + Cerrado. Ábrelo para que cualquiera, sin cuenta, pueda reportar un + error o proponer una idea; llegarán como tickets con la etiqueta + «propuesta». + } +

    +
    + +
    } @if (draft(); as d) { diff --git a/libs/web/tracker/presenters/src/lib/tracker.routes.ts b/libs/web/tracker/presenters/src/lib/tracker.routes.ts index 368179d..50383b9 100644 --- a/libs/web/tracker/presenters/src/lib/tracker.routes.ts +++ b/libs/web/tracker/presenters/src/lib/tracker.routes.ts @@ -32,6 +32,18 @@ export const trackerRoutes: Routes = [ loadComponent: () => import('./pages/board.page').then((m) => m.BoardPage), }, + { + path: 'proponer', + title: 'Proponer · TaskStream', + loadComponent: () => + import('./pages/propose.page').then((m) => m.ProposePage), + }, + { + path: 'list', + title: 'Lista · TaskStream', + loadComponent: () => + import('./pages/list.page').then((m) => m.ListPage), + }, { path: 'issues/:issueKey', title: 'Ticket · TaskStream', diff --git a/libs/web/tracker/presenters/src/lib/ui/bulk-bar.ts b/libs/web/tracker/presenters/src/lib/ui/bulk-bar.ts new file mode 100644 index 0000000..a8910fe --- /dev/null +++ b/libs/web/tracker/presenters/src/lib/ui/bulk-bar.ts @@ -0,0 +1,166 @@ +import { + ChangeDetectionStrategy, + Component, + computed, + inject, + input, + output, + signal, +} from '@angular/core'; +import { + PiActionButtonComponent, + PiSelectFieldComponent, + PiTextFieldComponent, + type PiSelectFieldOption, +} from '@pi/ui'; +import { ProjectFacade } from '@task-stream/web/tracker/application'; +import { BulkChange, IssuePriority } from '@task-stream/web/tracker/domain'; +import { options, PRIORITY } from './copy'; + +/** "Nobody" / "no sprint" in the selects. */ +const NOBODY = '__none__'; + +/** + * Edit in bulk: select all, then one change (status, assignee, sprint, + * priority or an extra label) for every selected ticket. Shared by the + * backlog and the list. + */ +@Component({ + selector: 'ts-bulk-bar', + changeDetection: ChangeDetectionStrategy.OnPush, + imports: [ + PiActionButtonComponent, + PiSelectFieldComponent, + PiTextFieldComponent, + ], + template: ` + + `, + styles: ` + .ts-bulk { + display: flex; + flex-wrap: wrap; + gap: 0.5rem; + align-items: center; + margin-bottom: 0.75rem; + pi-select-field, + pi-text-field { + width: 13rem; + } + } + .ts-bulk__all { + display: inline-flex; + gap: 0.375rem; + align-items: center; + font-size: 0.875rem; + } + `, +}) +export class BulkBarComponent { + /** How many tickets are selected. */ + readonly count = input.required(); + readonly allSelected = input.required(); + readonly selectAll = output(); + /** The change to make on every selected ticket. */ + readonly apply = output(); + + private readonly project = inject(ProjectFacade); + protected readonly fields: PiSelectFieldOption[] = [ + { value: 'status', label: 'Mover a…' }, + { value: 'assignee', label: 'Asignar a…' }, + { value: 'sprint', label: 'Sprint…' }, + { value: 'priority', label: 'Prioridad…' }, + { value: 'label', label: 'Añadir etiqueta…' }, + ]; + protected readonly field = signal('status'); + protected readonly value = signal(null); + protected readonly label = signal(''); + protected readonly statusOptions = computed[]>( + () => + this.project + .workflow() + .settings.statuses.filter((s) => !s.archived) + .map((s) => ({ value: s.id, label: s.name })), + ); + protected readonly assigneeOptions = computed[]>( + () => [ + { value: NOBODY, label: 'Nadie (sin asignar)' }, + ...this.project + .members() + .map((m) => ({ value: m.user.id, label: m.user.name })), + ], + ); + protected readonly sprintOptions = computed[]>( + () => [ + { value: NOBODY, label: 'Backlog (sin sprint)' }, + ...this.project + .openSprints() + .map((s) => ({ value: s.id, label: s.name })), + ], + ); + protected readonly priorityOptions = options(PRIORITY); + protected readonly canApply = computed(() => + this.field() === 'label' ? !!this.label().trim() : !!this.value(), + ); + + protected emit(): void { + const value = this.value(); + const change: BulkChange = {}; + switch (this.field()) { + case 'status': + if (value) change.status = value; + break; + case 'assignee': + change.assigneeId = value === NOBODY ? null : value; + break; + case 'sprint': + change.sprintId = value === NOBODY ? null : value; + break; + case 'priority': + if (value) change.priority = value as IssuePriority; + break; + case 'label': + change.addLabels = [this.label().trim().toLowerCase()]; + break; + } + this.apply.emit(change); + this.label.set(''); + } +} diff --git a/libs/web/tracker/presenters/src/lib/ui/issue-card.ts b/libs/web/tracker/presenters/src/lib/ui/issue-card.ts index f7b3519..46e983d 100644 --- a/libs/web/tracker/presenters/src/lib/ui/issue-card.ts +++ b/libs/web/tracker/presenters/src/lib/ui/issue-card.ts @@ -31,6 +31,17 @@ import { initials, PRIORITY, PRIORITY_LEVEL, typeLook } from './copy'; {{ issue().key }} + @if (issue().blockedBy.length) { + + + Bloqueado + + } @if (issue().area; as area) { {{ areaLabel(area) }} } @@ -180,6 +191,17 @@ import { initials, PRIORITY, PRIORITY_LEVEL, typeLook } from './copy'; font-weight: 600; color: var(--ts-ink-soft); } + .ts-card__blocked { + display: inline-flex; + gap: 0.25rem; + align-items: center; + padding: 0 0.375rem; + border-radius: 999px; + background: color-mix(in srgb, var(--ts-c-red, #d33) 12%, transparent); + color: var(--ts-c-red, var(--ts-ink)); + font-size: 0.6875rem; + font-weight: 600; + } .ts-card__area { margin-left: auto; font-family: var(--ts-font-mono); @@ -259,6 +281,8 @@ import { initials, PRIORITY, PRIORITY_LEVEL, typeLook } from './copy'; `, }) export class IssueCardComponent { + protected readonly blockerKey = (blocker: { key: string }) => blocker.key; + /** Late, due today or in the next two days. */ protected readonly due = computed(() => dueState(this.issue().dueDate, this.issue().statusCategory), diff --git a/libs/web/tracker/presenters/src/lib/ui/markdown.spec.ts b/libs/web/tracker/presenters/src/lib/ui/markdown.spec.ts new file mode 100644 index 0000000..30cb859 --- /dev/null +++ b/libs/web/tracker/presenters/src/lib/ui/markdown.spec.ts @@ -0,0 +1,49 @@ +import { renderMarkdown } from './markdown'; + +describe('renderMarkdown', () => { + it('formats Markdown, keeping single line breaks', () => { + const html = renderMarkdown( + '**Hecho** y _probado_\nen `main`\n\n- uno\n- dos', + ); + expect(html).toContain('Hecho'); + expect(html).toContain('probado
    '); + expect(html).toContain('main'); + expect(html).toContain('
  1. uno
  2. '); + }); + + it('highlights mentions, the reader own apart', () => { + const html = renderMarkdown('@[Ana López](101) y @[Bob](102)', '101'); + expect(html).toContain( + '@Ana López', + ); + expect(html).toContain( + '@Bob', + ); + }); + + it('lets nothing run, whatever someone writes', () => { + const html = renderMarkdown( + '
    hola
    ', + ); + expect(html).not.toMatch(/ { + const html = renderMarkdown( + '[docs](https://example.org) ![captura](attachment:3f2c-1)', + ); + expect(html).toContain('href="https://example.org"'); + expect(html).toContain('target="_blank"'); + expect(html).toContain('rel="noopener noreferrer"'); + expect(html).toMatch(/captura/); + }); + + it('shows task lists as ticked boxes nobody can click', () => { + const html = renderMarkdown('- [x] Reproducido\n- [ ] Arreglado'); + expect(html).toContain(''); + expect(html).toContain(''); + }); +}); diff --git a/libs/web/tracker/presenters/src/lib/ui/markdown.ts b/libs/web/tracker/presenters/src/lib/ui/markdown.ts new file mode 100644 index 0000000..1e8003f --- /dev/null +++ b/libs/web/tracker/presenters/src/lib/ui/markdown.ts @@ -0,0 +1,410 @@ +import { + ChangeDetectionStrategy, + Component, + computed, + DestroyRef, + Directive, + effect, + ElementRef, + HostListener, + inject, + input, + signal, + untracked, + ViewEncapsulation, +} from '@angular/core'; +import { DomSanitizer } from '@angular/platform-browser'; +import { mentionSegments } from '@task-stream/web/tracker/domain'; +import DOMPurify from 'dompurify'; +import { marked } from 'marked'; +import { Observable } from 'rxjs'; + +/** Images pasted into a text are stored as attachments: `![name](attachment:)`. */ +const ATTACHMENT = /^attachment:([\w-]{1,64})$/; + +const ALLOWED_TAGS = [ + 'p', + 'br', + 'strong', + 'em', + 'del', + 'code', + 'pre', + 'blockquote', + 'hr', + 'h1', + 'h2', + 'h3', + 'h4', + 'ul', + 'ol', + 'li', + 'a', + 'img', + 'span', + 'table', + 'thead', + 'tbody', + 'tr', + 'th', + 'td', + 'input', +]; + +let hooked = false; + +/** Links open apart; only mentions keep a class; attachment images wait to be fetched. */ +function installHooks(): void { + if (hooked) return; + hooked = true; + DOMPurify.addHook('afterSanitizeAttributes', (node) => { + if (node.tagName === 'A') { + node.setAttribute('target', '_blank'); + node.setAttribute('rel', 'noopener noreferrer'); + } + if (node.tagName === 'IMG') { + const id = ATTACHMENT.exec(node.getAttribute('src') ?? '')?.[1]; + if (id) { + node.removeAttribute('src'); + node.setAttribute('data-attachment', id); + } + } + if (node.tagName === 'INPUT') { + // Task lists: `- [x] done` renders as a ticked, read-only box. + if (node.getAttribute('type') !== 'checkbox') node.remove(); + else node.setAttribute('disabled', ''); + } + const cls = node.getAttribute('class'); + if (cls && !/^ts-mention( is-me)?$/.test(cls)) + node.removeAttribute('class'); + }); +} + +const escapeHtml = (text: string) => + text.replace( + /[&<>"']/g, + (c) => + ({ '&': '&', '<': '<', '>': '>', '"': '"', "'": ''' })[ + c + ] ?? c, + ); + +/** + * A description, comment or release note as safe HTML: Markdown (GitHub's + * flavour, single line breaks kept), `@[Name](id)` mentions highlighted + * (`me` marks one's own), and nothing that could run: whatever someone wrote + * goes through DOMPurify with a short list of tags. + */ +export function renderMarkdown(text: string, me: string | null = null): string { + installHooks(); + const withMentions = mentionSegments(text) + .map((part) => + 'mention' in part + ? `@${escapeHtml(part.mention)}` + : part.text, + ) + .join(''); + const html = marked.parse(withMentions, { + gfm: true, + breaks: true, + async: false, + }); + return DOMPurify.sanitize(html, { + ALLOWED_TAGS, + ALLOWED_ATTR: [ + 'href', + 'title', + 'alt', + 'src', + 'class', + 'data-user', + 'type', + 'checked', + 'disabled', + ], + // DOMPurify's own rule plus `attachment:`: links and images to http(s), + // mail or a pasted file; plain values (`type="checkbox"`) still pass. + ALLOWED_URI_REGEXP: + /^(?:(?:https?|mailto|attachment):|[^a-z]|[a-z+.-]+(?:[^a-z+.\-:]|$))/i, + }); +} + +/** Fetches an attachment's bytes (with the session), by id. */ +export type AttachmentLoader = (attachmentId: string) => Observable; + +/** + * Formatted text: Markdown rendered safely. Pasted images (`attachment:`) + * are fetched with `loader`, since a private project's files need the + * session and an `` cannot send it. + */ +@Component({ + selector: 'ts-markdown', + changeDetection: ChangeDetectionStrategy.OnPush, + encapsulation: ViewEncapsulation.None, + template: '
    ', + styles: ` + .ts-md { + display: block; + min-width: 0; + overflow-wrap: anywhere; + line-height: 1.55; + + > :first-child { + margin-top: 0; + } + > :last-child { + margin-bottom: 0; + } + p, + ul, + ol, + pre, + blockquote, + table { + margin: 0 0 0.625rem; + } + h1, + h2, + h3, + h4 { + margin: 1rem 0 0.5rem; + line-height: 1.25; + } + h1 { + font-size: 1.375rem; + } + h2 { + font-size: 1.1875rem; + } + h3, + h4 { + font-size: 1rem; + } + ul, + ol { + padding-left: 1.375rem; + } + li:has(> input[type='checkbox']) { + list-style: none; + margin-left: -1.375rem; + } + a { + color: var(--ts-brand); + } + code { + padding: 0.0625rem 0.3125rem; + border-radius: 0.3125rem; + background: color-mix(in srgb, var(--ts-ink) 8%, transparent); + font-family: var(--ts-mono, ui-monospace, monospace); + font-size: 0.875em; + } + pre { + padding: 0.75rem 0.875rem; + overflow-x: auto; + border-radius: 0.5rem; + background: color-mix(in srgb, var(--ts-ink) 7%, transparent); + code { + padding: 0; + background: none; + } + } + blockquote { + padding: 0 0 0 0.875rem; + border-left: 3px solid var(--ts-line-strong, var(--ts-line)); + color: var(--ts-muted); + font-size: inherit; + quotes: none; + &::before, + &::after { + content: none; + } + } + img { + display: block; + max-width: 100%; + max-height: 28rem; + border-radius: 0.5rem; + border: 1px solid var(--ts-line); + } + img[data-attachment]:not([src]) { + width: 12rem; + height: 6rem; + background: color-mix(in srgb, var(--ts-ink) 6%, transparent); + } + table { + border-collapse: collapse; + display: block; + overflow-x: auto; + } + th, + td { + padding: 0.375rem 0.625rem; + border: 1px solid var(--ts-line); + text-align: left; + } + hr { + border: 0; + border-top: 1px solid var(--ts-line); + } + .ts-mention { + padding: 0 0.2em; + border-radius: 0.25em; + background: color-mix(in oklab, var(--ts-brand) 14%, transparent); + color: inherit; + font-weight: 600; + } + .ts-mention.is-me { + background: color-mix(in oklab, var(--ts-brand) 30%, transparent); + } + } + `, +}) +export class MarkdownComponent { + readonly text = input(''); + /** Signed-in user's id, to mark mentions of oneself. */ + readonly me = input(null); + readonly loader = input(null); + + private readonly host = inject>(ElementRef); + private readonly sanitizer = inject(DomSanitizer); + /** Object URLs of the images already fetched, by attachment id. */ + private readonly urls = new Map(); + + // Sanitised above with DOMPurify; Angular's own pass would drop the mentions' data. + protected readonly html = computed(() => + this.sanitizer.bypassSecurityTrustHtml( + renderMarkdown(this.text() ?? '', this.me()), + ), + ); + + constructor() { + effect(() => { + this.html(); + const loader = this.loader(); + // After the new HTML is in place. + untracked(() => queueMicrotask(() => this.loadImages(loader))); + }); + inject(DestroyRef).onDestroy(() => { + for (const url of this.urls.values()) URL.revokeObjectURL(url); + }); + } + + private loadImages(loader: AttachmentLoader | null): void { + if (!loader) return; + const images = this.host.nativeElement.querySelectorAll( + 'img[data-attachment]', + ); + for (const img of Array.from(images)) { + const id = img.dataset['attachment'] ?? ''; + const known = this.urls.get(id); + if (known) { + img.src = known; + continue; + } + loader(id).subscribe({ + next: (blob) => { + const url = URL.createObjectURL(blob); + this.urls.set(id, url); + img.src = url; + }, + error: () => img.setAttribute('alt', `${img.alt} (no disponible)`), + }); + } + } +} + +/** + * Under a text box: that it takes Markdown, and a preview of what will show. + */ +@Component({ + selector: 'ts-markdown-hint', + changeDetection: ChangeDetectionStrategy.OnPush, + imports: [MarkdownComponent], + template: ` +
    + Admite Markdown: **negrita**, _cursiva_, código, listas y + enlaces{{ images() ? '; pega capturas con Ctrl+V' : '' }}. + +
    + @if (open() && text()?.trim()) { + + } + `, + styles: ` + :host { + display: grid; + gap: 0.5rem; + } + .ts-md-hint { + display: flex; + flex-wrap: wrap; + gap: 0.25rem 0.75rem; + align-items: baseline; + font-size: 0.75rem; + } + .ts-md-preview { + padding: 0.75rem 0.875rem; + border: 1px dashed var(--ts-line-strong, var(--ts-line)); + border-radius: 0.625rem; + } + `, +}) +export class MarkdownHintComponent { + readonly text = input(''); + readonly me = input(null); + readonly loader = input(null); + /** Whether pasting images is on for the box above. */ + readonly images = input(false); + protected readonly open = signal(false); +} + +/** Uploads a pasted image and answers its attachment id. */ +export type ImageUploader = (file: File) => Observable; + +/** + * On a textarea (or a component wrapping one): pasting an image uploads it + * and writes `![name](attachment:)` where the caret was. The text is + * changed through an `input` event, so whatever binds the field sees it. + */ +@Directive({ selector: '[tsPasteImages]' }) +export class PasteImagesDirective { + readonly tsPasteImages = input(null); + private readonly destroyRef = inject(DestroyRef); + + @HostListener('paste', ['$event']) + onPaste(event: ClipboardEvent): void { + const upload = this.tsPasteImages(); + const files = Array.from(event.clipboardData?.files ?? []).filter((f) => + f.type.startsWith('image/'), + ); + const area = event.target as HTMLTextAreaElement | null; + if (!upload || !files.length || area?.tagName !== 'TEXTAREA') return; + event.preventDefault(); + let caret = area.selectionStart ?? area.value.length; + for (const file of files) { + const name = (file.name || 'captura').replace(/[[\]()\n]/g, ' '); + const sub = upload(file).subscribe((id) => { + const snippet = `\n![${name}](attachment:${id})\n`; + area.value = + area.value.slice(0, caret) + snippet + area.value.slice(caret); + caret += snippet.length; + area.dispatchEvent(new Event('input', { bubbles: true })); + }); + this.destroyRef.onDestroy(() => sub.unsubscribe()); + } + } +} diff --git a/libs/web/tracker/presenters/src/lib/ui/vote.ts b/libs/web/tracker/presenters/src/lib/ui/vote.ts new file mode 100644 index 0000000..933ca01 --- /dev/null +++ b/libs/web/tracker/presenters/src/lib/ui/vote.ts @@ -0,0 +1,78 @@ +import { + ChangeDetectionStrategy, + Component, + input, + output, +} from '@angular/core'; + +/** + * ▲ 3: how many want a ticket. A button for whoever can vote (the + * signed-in, on a public project), the count alone for the rest. + */ +@Component({ + selector: 'ts-vote', + changeDetection: ChangeDetectionStrategy.OnPush, + template: ` + @if (canVote()) { + + } @else { + ▲ {{ votes() }} + } + `, + styles: ` + :host { + display: inline-flex; + } + /* @pi/ui styles every