From f2db469c758264c7d1b0c6871952c0b3b54fcd44 Mon Sep 17 00:00:00 2001 From: Muhsin Keloth Date: Fri, 10 May 2024 16:59:41 +0530 Subject: [PATCH] feat: add basic create issue feature --- .../dashboard/api/integrations/linear.js | 42 +++ app/javascript/dashboard/featureFlags.js | 1 + .../i18n/locale/en/integrations.json | 16 + app/javascript/dashboard/mixins/uiSettings.js | 1 + .../dashboard/conversation/ContactPanel.vue | 24 +- .../conversation/linear/AddIssue.vue | 306 ++++++++++++++++++ .../conversation/linear/IssueItem.vue | 144 +++++++++ .../dashboard/conversation/linear/index.vue | 108 +++++++ 8 files changed, 641 insertions(+), 1 deletion(-) create mode 100644 app/javascript/dashboard/api/integrations/linear.js create mode 100644 app/javascript/dashboard/routes/dashboard/conversation/linear/AddIssue.vue create mode 100644 app/javascript/dashboard/routes/dashboard/conversation/linear/IssueItem.vue create mode 100644 app/javascript/dashboard/routes/dashboard/conversation/linear/index.vue diff --git a/app/javascript/dashboard/api/integrations/linear.js b/app/javascript/dashboard/api/integrations/linear.js new file mode 100644 index 000000000..e4d3294b0 --- /dev/null +++ b/app/javascript/dashboard/api/integrations/linear.js @@ -0,0 +1,42 @@ +/* global axios */ + +import ApiClient from '../ApiClient'; + +class LinearAPI extends ApiClient { + constructor() { + super('integrations/linear', { accountScoped: true }); + } + + getTeams() { + return axios.get(`${this.url}/teams`); + } + + getTeamEntities(teamId) { + return axios.get(`${this.url}/team_entities?team_id=${teamId}`); + } + + createIssue(data) { + return axios.post(`${this.url}/create_issue`, data); + } + + link_issue(conversationId, issueId) { + return axios.post(`${this.url}/link_issue`, { + issue_id: issueId, + conversation_id: conversationId, + }); + } + + getLinkedIssue(conversationId) { + return axios.get( + `${this.url}/linked_issue?conversation_id=${conversationId}` + ); + } + + unlinkIssue(linkId) { + return axios.post(`${this.url}/unlink_issue`, { + link_id: linkId, + }); + } +} + +export default new LinearAPI(); diff --git a/app/javascript/dashboard/featureFlags.js b/app/javascript/dashboard/featureFlags.js index a0453b7d3..11d6c43de 100644 --- a/app/javascript/dashboard/featureFlags.js +++ b/app/javascript/dashboard/featureFlags.js @@ -30,4 +30,5 @@ export const FEATURE_FLAGS = { EMAIL_CONTINUITY_ON_API_CHANNEL: 'email_continuity_on_api_channel', INBOUND_EMAILS: 'inbound_emails', IP_LOOKUP: 'ip_lookup', + LINEAR: 'linear_integration', }; diff --git a/app/javascript/dashboard/i18n/locale/en/integrations.json b/app/javascript/dashboard/i18n/locale/en/integrations.json index 008ae37b4..e1df12abd 100644 --- a/app/javascript/dashboard/i18n/locale/en/integrations.json +++ b/app/javascript/dashboard/i18n/locale/en/integrations.json @@ -205,6 +205,9 @@ } }, "LINEAR": { + "ADD_OR_LINK_BUTTON": "Create/Link Linear Issue", + "LOADING": "Fetching linear issues...", + "LOADING_ERROR": "There was an error fetching the linear issues, please try again", "ADD_OR_LINK": { "TITLE": "Create/link linear issue", "DESCRIPTION": "Create or link a linear issue to the conversation", @@ -240,9 +243,22 @@ }, "CREATE": "Create", "CANCEL": "Cancel", + "CREATE_SUCCESS": "Issue created successfully", "CREATE_ERROR": "There was an error creating the issue, please try again", "LOADING_TEAM_ERROR": "There was an error fetching the teams, please try again", "LOADING_TEAM_ENTITIES_ERROR": "There was an error fetching the team entities, please try again" + }, + "ISSUE": { + "STATUS": "Status", + "PRIORITY": "Priority", + "ASSIGNEE": "Assignee", + "LABELS": "Labels", + "CREATED_AT": "Created at" + }, + "UNLINK": { + "TITLE": "Unlink", + "SUCCESS": "Issue unlinked successfully", + "ERROR": "There was an error unlinking the issue, please try again" } } } diff --git a/app/javascript/dashboard/mixins/uiSettings.js b/app/javascript/dashboard/mixins/uiSettings.js index 2c60db3cb..bb07a8274 100644 --- a/app/javascript/dashboard/mixins/uiSettings.js +++ b/app/javascript/dashboard/mixins/uiSettings.js @@ -7,6 +7,7 @@ export const DEFAULT_CONVERSATION_SIDEBAR_ITEMS_ORDER = [ { name: 'contact_attributes' }, { name: 'previous_conversation' }, { name: 'conversation_participants' }, + { name: 'linear' }, ]; export const DEFAULT_CONTACT_SIDEBAR_ITEMS_ORDER = [ { name: 'contact_attributes' }, diff --git a/app/javascript/dashboard/routes/dashboard/conversation/ContactPanel.vue b/app/javascript/dashboard/routes/dashboard/conversation/ContactPanel.vue index aa5f5cc12..7c7b3b550 100644 --- a/app/javascript/dashboard/routes/dashboard/conversation/ContactPanel.vue +++ b/app/javascript/dashboard/routes/dashboard/conversation/ContactPanel.vue @@ -23,6 +23,18 @@ :key="element.name" class="bg-white dark:bg-gray-800" > +
+ + + +
+
+ + +
+
+ +