Skip to content

Commit

Permalink
Merge branch 'master' into release-bump-4.1.0
Browse files Browse the repository at this point in the history
  • Loading branch information
mattermost-build committed Jan 10, 2024
2 parents 31fc66f + 06edb28 commit c52dea3
Show file tree
Hide file tree
Showing 7 changed files with 32 additions and 63 deletions.
4 changes: 2 additions & 2 deletions server/instance_cloud_oauth.go
Original file line number Diff line number Diff line change
Expand Up @@ -218,11 +218,11 @@ func (ci *cloudOAuthInstance) GetJiraBaseURL() string {
}

func (ci *cloudOAuthInstance) GetManageAppsURL() string {
return fmt.Sprintf("%s/plugins/servlet/applinks/listApplicationLinks", ci.GetURL())
return fmt.Sprintf("%s/plugins/servlet/applinks/listApplicationLinks", ci.GetJiraBaseURL())
}

func (ci *cloudOAuthInstance) GetManageWebhooksURL() string {
return fmt.Sprintf("%s/plugins/servlet/webhooks", ci.GetURL())
return fmt.Sprintf("%s/plugins/servlet/webhooks", ci.GetJiraBaseURL())
}

func (ci *cloudOAuthInstance) GetMattermostKey() string {
Expand Down
2 changes: 0 additions & 2 deletions webapp/src/action_types/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,4 @@ export default {

RECEIVED_CHANNEL_SUBSCRIPTIONS: `${PluginId}_recevied_channel_subscriptions`,
DELETED_CHANNEL_SUBSCRIPTION: `${PluginId}_deleted_channel_subscription`,

RECEIVED_JIRA_TICKET: `${PluginId}_received_jira_ticket`,
};
5 changes: 0 additions & 5 deletions webapp/src/actions/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -526,11 +526,6 @@ export const fetchIssueByKey = (issueKey: string, instanceID: string) => {
data = await doFetch(`${baseUrl}/api/v2/get-issue-by-key?${params}`, {
method: 'get',
});

dispatch({
type: ActionTypes.RECEIVED_JIRA_TICKET,
data,
});
return {data};
} catch (error) {
return {error};
Expand Down
5 changes: 1 addition & 4 deletions webapp/src/components/jira_ticket_tooltip/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,14 @@ import {connect} from 'react-redux';
import {bindActionCreators, Dispatch} from 'redux';
import {GlobalState} from 'mattermost-redux/types/store';

import {jiraIssueToReducer} from 'utils/jira_issue_metadata';

import {isUserConnected, getStoredLinkTooltipIssue, getUserConnectedInstances, getDefaultUserInstanceID} from 'selectors';
import {isUserConnected, getUserConnectedInstances} from 'selectors';
import {fetchIssueByKey} from 'actions';

import TicketPopover from './jira_ticket_tooltip';

const mapStateToProps = (state: GlobalState) => {
return {
connected: isUserConnected(state),
ticketDetails: jiraIssueToReducer(getStoredLinkTooltipIssue(state).ticket),
connectedInstances: getUserConnectedInstances(state),
};
};
Expand Down
53 changes: 15 additions & 38 deletions webapp/src/components/jira_ticket_tooltip/jira_ticket_tooltip.tsx
Original file line number Diff line number Diff line change
@@ -1,19 +1,18 @@
import React, {ReactNode} from 'react';
import {Dispatch} from 'redux';

import {Instance} from 'types/model';
import {TicketData, TicketDetails} from 'types/tooltip';
import DefaultAvatar from 'components/default_avatar/default_avatar';

import './ticketStyle.scss';
import {getJiraTicketDetails} from 'utils/jira_issue_metadata';

export type Props = {
href: string;
show: boolean;
connected: boolean;
ticketDetails?: TicketDetails | null;
connectedInstances: Instance[];
fetchIssueByKey: (issueKey: string, instanceID: string) => Promise<void>;
fetchIssueByKey: (issueKey: string, instanceID: string) => Promise<{data?: TicketData}>;
}

export type State = {
Expand Down Expand Up @@ -78,48 +77,26 @@ export default class TicketPopover extends React.PureComponent<Props, State> {
return null;
}

isUserConnectedAndStateNotLoaded() {
const {connected} = this.props;
const {ticketDetails} = this.state;

return Boolean(connected && ticketDetails);
}

componentDidMount() {
if (!this.state.ticketId) {
return;
}

const {ticketDetails} = this.props;
const {ticketId} = this.state;
if (this.isUserConnectedAndStateNotLoaded() && ticketDetails && ticketDetails.ticketId === ticketId) {
this.setTicket(this.props);
}
}

componentDidUpdate() {
const issueKey = this.getIssueKey();
if (!issueKey) {
return;
}

const {instanceID} = issueKey;
const {ticketDetails} = this.props;
const {ticketId, ticketDetails: localTicketDetails} = this.state;

if (!localTicketDetails && ticketDetails && ticketDetails.ticketId === ticketId) {
this.setTicket(this.props);
} else if (!localTicketDetails && this.props.show && ticketId) {
this.props.fetchIssueByKey(ticketId, instanceID);
const {ticketId, ticketDetails} = this.state;
if (!ticketDetails && this.props.show && ticketId) {
this.props.fetchIssueByKey(this.state.ticketId, instanceID).then((res: {data?: TicketData}) => {
const updatedTicketDetails = getJiraTicketDetails(res.data);
if (this.props.connected && updatedTicketDetails && updatedTicketDetails.ticketId === ticketId) {
this.setState({
ticketDetails: updatedTicketDetails,
});
}
});
}
}

setTicket(data: Props) {
this.setState({
ticketDetails: data.ticketDetails,
});
}

fixVersionLabel(fixVersion: string) {
if (fixVersion) {
const fixVersionString = 'Fix Version :';
Expand All @@ -139,7 +116,7 @@ export default class TicketPopover extends React.PureComponent<Props, State> {
tagTicketStatus(ticketStatus: string) {
let ticketStatusClass = 'default-style ticket-status--default';

const myStatusClass = myStatusClasses[ticketStatus.toLowerCase()];
const myStatusClass = myStatusClasses[ticketStatus && ticketStatus.toLowerCase()];
if (myStatusClass) {
ticketStatusClass = 'default-style ' + myStatusClass;
}
Expand All @@ -148,7 +125,7 @@ export default class TicketPopover extends React.PureComponent<Props, State> {
}

renderLabelList(labels: string[]) {
if (!labels.length) {
if (!labels || !labels.length) {
return null;
}

Expand Down Expand Up @@ -243,7 +220,7 @@ export default class TicketPopover extends React.PureComponent<Props, State> {
target='_blank'
rel='noopener noreferrer'
>
<h5>{ticketDetails.summary.substring(0, jiraTicketSummaryMaxLength)}</h5>
<h5>{ticketDetails.summary && ticketDetails.summary.substring(0, jiraTicketSummaryMaxLength)}</h5>
</a>
{this.tagTicketStatus(ticketDetails.statusKey)}
</div>
Expand Down
8 changes: 4 additions & 4 deletions webapp/src/utils/jira_issue_metadata.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import {useFieldForIssueMetadata} from 'testdata/jira-issue-metadata-helpers';
import {IssueMetadata, JiraField, FilterField, ChannelSubscriptionFilters, FilterFieldInclusion, IssueType, Project} from 'types/model';
import {IssueAction, TicketDetails} from 'types/tooltip';

import {getCustomFieldFiltersForProjects, generateJQLStringFromSubscriptionFilters, getConflictingFields, jiraIssueToReducer} from './jira_issue_metadata';
import {getCustomFieldFiltersForProjects, generateJQLStringFromSubscriptionFilters, getConflictingFields, getJiraTicketDetails} from './jira_issue_metadata';

describe('utils/jira_issue_metadata', () => {
const useField = (field: JiraField, key: string): IssueMetadata => {
Expand Down Expand Up @@ -593,7 +593,7 @@ describe('utils/jira_issue_metadata', () => {
});
});

describe('jiraIssueToReducer', () => {
describe('getJiraTicketDetails', () => {
it('should return the ticket details with all fields', () => {
const action: IssueAction = ticketData('Mock Name');

Expand All @@ -610,7 +610,7 @@ describe('utils/jira_issue_metadata', () => {
issueIcon: 'https://something.atlassian.net/issuetype.png',
};

const result = jiraIssueToReducer(action.data);
const result = getJiraTicketDetails(action.data);

expect(result).toEqual(expectedTicketDetails);
});
Expand All @@ -631,7 +631,7 @@ describe('utils/jira_issue_metadata', () => {
issueIcon: 'https://something.atlassian.net/issuetype.png',
};

const result = jiraIssueToReducer(action.data);
const result = getJiraTicketDetails(action.data);

expect(result).toEqual(expectedTicketDetails);
});
Expand Down
18 changes: 10 additions & 8 deletions webapp/src/utils/jira_issue_metadata.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -376,23 +376,25 @@ export function generateJQLStringFromSubscriptionFilters(issueMetadata: IssueMet
return [projectJQL, issueTypesJQL, filterFieldsJQL].filter(Boolean).join(' AND ');
}

export function jiraIssueToReducer(data: TicketData): TicketDetails | null {
export function getJiraTicketDetails(data?: TicketData): TicketDetails | null {
if (!data) {
return null;
}

const assignee = data && data.fields && data.fields.assignee ? data.fields.assignee : null;
const ticketDetails: TicketDetails = {

// TODO: Add optional chaining operator
assigneeName: (assignee && assignee.displayName) || '',
assigneeAvatar: (assignee && assignee.avatarUrls && assignee.avatarUrls['48x48']) || '',
labels: data.fields.labels,
description: data.fields.description,
summary: data.fields.summary,
labels: data.fields && data.fields.labels,
description: data.fields && data.fields.description,
summary: data.fields && data.fields.summary,
ticketId: data.key,
jiraIcon: data.fields.project.avatarUrls && data.fields.project.avatarUrls['48x48'],
versions: data.fields.versions.length ? data.fields.versions[0] : '',
statusKey: data.fields.status.name,
issueIcon: data.fields.issuetype.iconUrl,
jiraIcon: data.fields && data.fields.project && data.fields.project.avatarUrls && data.fields.project.avatarUrls['48x48'],
versions: data.fields && data.fields.versions && data.fields.versions.length ? data.fields.versions[0] : '',
statusKey: data.fields && data.fields.status && data.fields.status.name,
issueIcon: data.fields && data.fields.issuetype && data.fields.issuetype.iconUrl,
};
return ticketDetails;
}

0 comments on commit c52dea3

Please sign in to comment.