diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2020-01-15 21:08:34 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2020-01-15 21:08:34 +0300 |
commit | 571d993b49313dd806bd3f6af16d36c26d9d28ca (patch) | |
tree | 06bd12c4b56b97881aef8a00d4d46698de1eb63f /app/assets/javascripts/error_tracking | |
parent | 9044365a91112d426fbbfba07eca595652bbe2df (diff) |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'app/assets/javascripts/error_tracking')
8 files changed, 98 insertions, 19 deletions
diff --git a/app/assets/javascripts/error_tracking/components/error_details.vue b/app/assets/javascripts/error_tracking/components/error_details.vue index 23a1ec4e367..43e18486ae9 100644 --- a/app/assets/javascripts/error_tracking/components/error_details.vue +++ b/app/assets/javascripts/error_tracking/components/error_details.vue @@ -30,6 +30,14 @@ export default { }, mixins: [timeagoMixin], props: { + listPath: { + type: String, + required: true, + }, + issueUpdatePath: { + type: String, + required: true, + }, issueId: { type: String, required: true, @@ -81,7 +89,14 @@ export default { }; }, computed: { - ...mapState('details', ['error', 'loading', 'loadingStacktrace', 'stacktraceData']), + ...mapState('details', [ + 'error', + 'loading', + 'loadingStacktrace', + 'stacktraceData', + 'updatingResolveStatus', + 'updatingIgnoreStatus', + ]), ...mapGetters('details', ['stacktrace']), reported() { return sprintf( @@ -137,12 +152,15 @@ export default { this.startPollingStacktrace(this.issueStackTracePath); }, methods: { - ...mapActions('details', ['startPollingDetails', 'startPollingStacktrace']), + ...mapActions('details', ['startPollingDetails', 'startPollingStacktrace', 'updateStatus']), trackClickErrorLinkToSentryOptions, createIssue() { this.issueCreationInProgress = true; this.$refs.sentryIssueForm.submit(); }, + updateIssueStatus(status) { + this.updateStatus({ endpoint: this.issueUpdatePath, redirectUrl: this.listPath, status }); + }, formatDate(date) { return `${this.timeFormatted(date)} (${dateFormat(date, 'UTC:yyyy-mm-dd h:MM:ssTT Z')})`; }, @@ -158,24 +176,42 @@ export default { <div v-else-if="showDetails" class="error-details"> <div class="top-area align-items-center justify-content-between py-3"> <span v-if="!loadingStacktrace && stacktrace" v-html="reported"></span> - <form ref="sentryIssueForm" :action="projectIssuesPath" method="POST"> - <gl-form-input class="hidden" name="issue[title]" :value="issueTitle" /> - <input name="issue[description]" :value="issueDescription" type="hidden" /> - <gl-form-input - :value="GQLerror.id" - class="hidden" - name="issue[sentry_issue_attributes][sentry_issue_identifier]" + <div class="d-inline-flex"> + <loading-button + :label="__('Ignore')" + :loading="updatingIgnoreStatus" + @click="updateIssueStatus('ignored')" /> - <gl-form-input :value="csrfToken" class="hidden" name="authenticity_token" /> <loading-button - v-if="!error.gitlab_issue" - class="btn-success" - :label="__('Create issue')" - :loading="issueCreationInProgress" - data-qa-selector="create_issue_button" - @click="createIssue" + class="btn-outline-info ml-2" + :label="__('Resolve')" + :loading="updatingResolveStatus" + @click="updateIssueStatus('resolved')" /> - </form> + <form + ref="sentryIssueForm" + :action="projectIssuesPath" + method="POST" + class="d-inline-block ml-2" + > + <gl-form-input class="hidden" name="issue[title]" :value="issueTitle" /> + <input name="issue[description]" :value="issueDescription" type="hidden" /> + <gl-form-input + :value="GQLerror.id" + class="hidden" + name="issue[sentry_issue_attributes][sentry_issue_identifier]" + /> + <gl-form-input :value="csrfToken" class="hidden" name="authenticity_token" /> + <loading-button + v-if="!error.gitlab_issue" + class="btn-success" + :label="__('Create issue')" + :loading="issueCreationInProgress" + data-qa-selector="create_issue_button" + @click="createIssue" + /> + </form> + </div> </div> <div> <tooltip-on-truncate :title="GQLerror.title" truncate-target="child" placement="top"> diff --git a/app/assets/javascripts/error_tracking/details.js b/app/assets/javascripts/error_tracking/details.js index b9761cdf2c1..c18298dec4f 100644 --- a/app/assets/javascripts/error_tracking/details.js +++ b/app/assets/javascripts/error_tracking/details.js @@ -25,6 +25,8 @@ export default () => { const { issueId, projectPath, + listPath, + issueUpdatePath, issueDetailsPath, issueStackTracePath, projectIssuesPath, @@ -34,6 +36,8 @@ export default () => { props: { issueId, projectPath, + listPath, + issueUpdatePath, issueDetailsPath, issueStackTracePath, projectIssuesPath, diff --git a/app/assets/javascripts/error_tracking/services/index.js b/app/assets/javascripts/error_tracking/services/index.js index 3b3f8311d67..3fb317c17f5 100644 --- a/app/assets/javascripts/error_tracking/services/index.js +++ b/app/assets/javascripts/error_tracking/services/index.js @@ -4,4 +4,7 @@ export default { getSentryData({ endpoint, params }) { return axios.get(endpoint, { params }); }, + updateErrorStatus(endpoint, status) { + return axios.put(endpoint, { status }); + }, }; diff --git a/app/assets/javascripts/error_tracking/store/actions.js b/app/assets/javascripts/error_tracking/store/actions.js new file mode 100644 index 00000000000..bb8b039b5df --- /dev/null +++ b/app/assets/javascripts/error_tracking/store/actions.js @@ -0,0 +1,19 @@ +import service from './../services'; +import * as types from './mutation_types'; +import createFlash from '~/flash'; +import { visitUrl } from '~/lib/utils/url_utility'; +import { __ } from '~/locale'; + +export function updateStatus({ commit }, { endpoint, redirectUrl, status }) { + const type = + status === 'resolved' ? types.SET_UPDATING_RESOLVE_STATUS : types.SET_UPDATING_IGNORE_STATUS; + commit(type, true); + + return service + .updateErrorStatus(endpoint, status) + .then(() => visitUrl(redirectUrl)) + .catch(() => createFlash(__('Failed to update issue status'))) + .finally(() => commit(type, false)); +} + +export default () => {}; diff --git a/app/assets/javascripts/error_tracking/store/details/state.js b/app/assets/javascripts/error_tracking/store/details/state.js index 95fb0ba0558..52b0297607d 100644 --- a/app/assets/javascripts/error_tracking/store/details/state.js +++ b/app/assets/javascripts/error_tracking/store/details/state.js @@ -3,4 +3,6 @@ export default () => ({ stacktraceData: {}, loading: true, loadingStacktrace: true, + updatingResolveStatus: false, + updatingIgnoreStatus: false, }); diff --git a/app/assets/javascripts/error_tracking/store/index.js b/app/assets/javascripts/error_tracking/store/index.js index ad05eecef6c..75aa78d9c07 100644 --- a/app/assets/javascripts/error_tracking/store/index.js +++ b/app/assets/javascripts/error_tracking/store/index.js @@ -1,6 +1,9 @@ import Vue from 'vue'; import Vuex from 'vuex'; +import * as actions from './actions'; +import mutations from './mutations'; + import * as listActions from './list/actions'; import listMutations from './list/mutations'; import listState from './list/state'; @@ -24,8 +27,8 @@ export const createStore = () => details: { namespaced: true, state: detailsState(), - actions: detailsActions, - mutations: detailsMutations, + actions: { ...actions, ...detailsActions }, + mutations: { ...mutations, ...detailsMutations }, getters: detailsGetters, }, }, diff --git a/app/assets/javascripts/error_tracking/store/mutation_types.js b/app/assets/javascripts/error_tracking/store/mutation_types.js new file mode 100644 index 00000000000..30aebacbedd --- /dev/null +++ b/app/assets/javascripts/error_tracking/store/mutation_types.js @@ -0,0 +1,2 @@ +export const SET_UPDATING_RESOLVE_STATUS = 'SET_UPDATING_RESOLVE_STATUS'; +export const SET_UPDATING_IGNORE_STATUS = 'SET_UPDATING_IGNORE_STATUS'; diff --git a/app/assets/javascripts/error_tracking/store/mutations.js b/app/assets/javascripts/error_tracking/store/mutations.js new file mode 100644 index 00000000000..c7a7e46df40 --- /dev/null +++ b/app/assets/javascripts/error_tracking/store/mutations.js @@ -0,0 +1,10 @@ +import * as types from './mutation_types'; + +export default { + [types.SET_UPDATING_IGNORE_STATUS](state, updating) { + state.updatingIgnoreStatus = updating; + }, + [types.SET_UPDATING_RESOLVE_STATUS](state, updating) { + state.updatingResolveStatus = updating; + }, +}; |