diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2022-05-02 06:08:36 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2022-05-02 06:08:36 +0300 |
commit | 7f119dc26391dc953126b4fc902ade7b44a10ce2 (patch) | |
tree | 40f5ac2c1f8d9ed8e4cd2518536dd24314496919 /app/assets/javascripts/releases | |
parent | 47daa6f9b32e12583da237d672b92a39b741a26b (diff) |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'app/assets/javascripts/releases')
7 files changed, 97 insertions, 6 deletions
diff --git a/app/assets/javascripts/releases/components/app_edit_new.vue b/app/assets/javascripts/releases/components/app_edit_new.vue index 8365e6a5ab0..327da1fb2a1 100644 --- a/app/assets/javascripts/releases/components/app_edit_new.vue +++ b/app/assets/javascripts/releases/components/app_edit_new.vue @@ -1,5 +1,5 @@ <script> -import { GlButton, GlFormInput, GlFormGroup, GlSprintf } from '@gitlab/ui'; +import { GlButton, GlFormCheckbox, GlFormInput, GlFormGroup, GlLink, GlSprintf } from '@gitlab/ui'; import { mapState, mapActions, mapGetters } from 'vuex'; import { isSameOriginUrl, getParameterByName } from '~/lib/utils/url_utility'; import { __ } from '~/locale'; @@ -12,9 +12,11 @@ import TagField from './tag_field.vue'; export default { name: 'ReleaseEditNewApp', components: { + GlFormCheckbox, GlFormInput, GlFormGroup, GlButton, + GlLink, GlSprintf, MarkdownField, AssetLinksForm, @@ -28,6 +30,7 @@ export default { 'fetchError', 'markdownDocsPath', 'markdownPreviewPath', + 'editReleaseDocsPath', 'releasesPagePath', 'release', 'newMilestonePath', @@ -35,8 +38,9 @@ export default { 'projectId', 'groupId', 'groupMilestonesAvailable', + 'tagNotes', ]), - ...mapGetters('editNew', ['isValid', 'isExistingRelease']), + ...mapGetters('editNew', ['isValid', 'isExistingRelease', 'formattedReleaseNotes']), showForm() { return Boolean(!this.isFetchingRelease && !this.fetchError && this.release); }, @@ -64,6 +68,14 @@ export default { this.updateReleaseMilestones(milestones); }, }, + includeTagNotes: { + get() { + return this.$store.state.editNew.includeTagNotes; + }, + set(includeTagNotes) { + this.updateIncludeTagNotes(includeTagNotes); + }, + }, cancelPath() { const backUrl = getParameterByName(BACK_URL_PARAM); @@ -105,6 +117,7 @@ export default { 'updateReleaseTitle', 'updateReleaseNotes', 'updateReleaseMilestones', + 'updateIncludeTagNotes', ]), submitForm() { if (!this.isFormSubmissionDisabled) { @@ -161,7 +174,7 @@ export default { :markdown-preview-path="markdownPreviewPath" :markdown-docs-path="markdownDocsPath" :add-spacing-classes="false" - :textarea-value="releaseNotes" + :textarea-value="formattedReleaseNotes" class="gl-mt-3 gl-mb-3" > <template #textarea> @@ -178,6 +191,25 @@ export default { </markdown-field> </div> </gl-form-group> + <gl-form-group v-if="!isExistingRelease"> + <gl-form-checkbox v-model="includeTagNotes"> + {{ s__('Release|Include message from the annotated tag.') }} + + <template #help> + <gl-sprintf + :message=" + s__( + 'Release|You can edit the content later by editing the release. %{linkStart}How do I edit a release?%{linkEnd}', + ) + " + > + <template #link="{ content }"> + <gl-link :href="editReleaseDocsPath">{{ content }}</gl-link> + </template> + </gl-sprintf> + </template> + </gl-form-checkbox> + </gl-form-group> <asset-links-form /> diff --git a/app/assets/javascripts/releases/components/tag_field_new.vue b/app/assets/javascripts/releases/components/tag_field_new.vue index 9e05d00a98d..dcdf89ae0d9 100644 --- a/app/assets/javascripts/releases/components/tag_field_new.vue +++ b/app/assets/javascripts/releases/components/tag_field_new.vue @@ -62,7 +62,7 @@ export default { }, }, methods: { - ...mapActions('editNew', ['updateReleaseTagName', 'updateCreateFrom']), + ...mapActions('editNew', ['updateReleaseTagName', 'updateCreateFrom', 'fetchTagNotes']), markInputAsDirty() { this.isInputDirty = true; }, @@ -125,6 +125,7 @@ export default { :translations="$options.translations.tagName" :enabled-ref-types="$options.tagNameEnabledRefTypes" :state="!showTagNameValidationError" + @input="fetchTagNotes" @hide.once="markInputAsDirty" > <template #footer="{ isLoading, matches, query }"> diff --git a/app/assets/javascripts/releases/stores/modules/edit_new/actions.js b/app/assets/javascripts/releases/stores/modules/edit_new/actions.js index b3ba4f9263a..0a9bca97012 100644 --- a/app/assets/javascripts/releases/stores/modules/edit_new/actions.js +++ b/app/assets/javascripts/releases/stores/modules/edit_new/actions.js @@ -1,3 +1,4 @@ +import { getTag } from '~/rest_api'; import createFlash from '~/flash'; import { redirectTo } from '~/lib/utils/url_utility'; import { s__ } from '~/locale'; @@ -7,6 +8,7 @@ import deleteReleaseAssetLinkMutation from '~/releases/graphql/mutations/delete_ import updateReleaseMutation from '~/releases/graphql/mutations/update_release.mutation.graphql'; import oneReleaseForEditingQuery from '~/releases/graphql/queries/one_release_for_editing.query.graphql'; import { gqClient, convertOneReleaseGraphQLResponse } from '~/releases/util'; + import * as types from './mutation_types'; export const initializeRelease = ({ commit, dispatch, getters }) => { @@ -224,3 +226,23 @@ export const updateRelease = async ({ commit, dispatch, state, getters }) => { }); } }; + +export const fetchTagNotes = ({ commit, state }, tagName) => { + commit(types.REQUEST_TAG_NOTES); + + return getTag(state.projectId, tagName) + .then(({ data }) => { + commit(types.RECEIVE_TAG_NOTES_SUCCESS, data); + }) + .catch((error) => { + createFlash({ + message: s__('Release|Something went wrong while getting the tag notes.'), + }); + + commit(types.RECEIVE_TAG_NOTES_ERROR, error); + }); +}; + +export const updateIncludeTagNotes = ({ commit }, includeTagNotes) => { + commit(types.UPDATE_INCLUDE_TAG_NOTES, includeTagNotes); +}; diff --git a/app/assets/javascripts/releases/stores/modules/edit_new/getters.js b/app/assets/javascripts/releases/stores/modules/edit_new/getters.js index d4f49e53619..036bf4f3eaf 100644 --- a/app/assets/javascripts/releases/stores/modules/edit_new/getters.js +++ b/app/assets/javascripts/releases/stores/modules/edit_new/getters.js @@ -1,4 +1,5 @@ import { isEmpty } from 'lodash'; +import { s__ } from '~/locale'; import { hasContent } from '~/lib/utils/text_utility'; import { getDuplicateItemsFromArray } from '~/lib/utils/array_utility'; @@ -117,7 +118,7 @@ export const isValid = (_state, getters) => { }; /** Returns all the variables for a `releaseUpdate` GraphQL mutation */ -export const releaseUpdateMutatationVariables = (state) => { +export const releaseUpdateMutatationVariables = (state, getters) => { const name = state.release.name?.trim().length > 0 ? state.release.name.trim() : null; // Milestones may be either a list of milestone objects OR just a list @@ -129,7 +130,9 @@ export const releaseUpdateMutatationVariables = (state) => { projectPath: state.projectPath, tagName: state.release.tagName, name, - description: state.release.description, + description: state.includeTagNotes + ? getters.formattedReleaseNotes + : state.release.description, milestones, }, }; @@ -151,3 +154,8 @@ export const releaseCreateMutatationVariables = (state, getters) => { }, }; }; + +export const formattedReleaseNotes = ({ includeTagNotes, release: { description }, tagNotes }) => + includeTagNotes && tagNotes + ? `${description}\n\n### ${s__('Releases|Tag message')}\n\n${tagNotes}\n` + : description; diff --git a/app/assets/javascripts/releases/stores/modules/edit_new/mutation_types.js b/app/assets/javascripts/releases/stores/modules/edit_new/mutation_types.js index 1b2f5f33f02..daa077309a1 100644 --- a/app/assets/javascripts/releases/stores/modules/edit_new/mutation_types.js +++ b/app/assets/javascripts/releases/stores/modules/edit_new/mutation_types.js @@ -20,3 +20,9 @@ export const UPDATE_ASSET_LINK_URL = 'UPDATE_ASSET_LINK_URL'; export const UPDATE_ASSET_LINK_NAME = 'UPDATE_ASSET_LINK_NAME'; export const UPDATE_ASSET_LINK_TYPE = 'UPDATE_ASSET_LINK_TYPE'; export const REMOVE_ASSET_LINK = 'REMOVE_ASSET_LINK'; + +export const REQUEST_TAG_NOTES = 'REQUEST_TAG_NOTES'; +export const RECEIVE_TAG_NOTES_SUCCESS = 'RECEIVE_TAG_NOTES_SUCCESS'; +export const RECEIVE_TAG_NOTES_ERROR = 'RECEIVE_TAG_NOTES_ERROR'; + +export const UPDATE_INCLUDE_TAG_NOTES = 'UPDATE_INCLUDE_TAG_NOTES'; diff --git a/app/assets/javascripts/releases/stores/modules/edit_new/mutations.js b/app/assets/javascripts/releases/stores/modules/edit_new/mutations.js index cf282f9ab2c..38153e4c67b 100644 --- a/app/assets/javascripts/releases/stores/modules/edit_new/mutations.js +++ b/app/assets/javascripts/releases/stores/modules/edit_new/mutations.js @@ -95,4 +95,21 @@ export default { [types.REMOVE_ASSET_LINK](state, linkIdToRemove) { state.release.assets.links = state.release.assets.links.filter((l) => l.id !== linkIdToRemove); }, + + [types.REQUEST_TAG_NOTES](state) { + state.isFetchingTagNotes = true; + }, + [types.RECEIVE_TAG_NOTES_SUCCESS](state, data) { + state.fetchError = undefined; + state.isFetchingTagNotes = false; + state.tagNotes = data.message; + }, + [types.RECEIVE_TAG_NOTES_ERROR](state, error) { + state.fetchError = error; + state.isFetchingTagNotes = false; + state.tagNotes = ''; + }, + [types.UPDATE_INCLUDE_TAG_NOTES](state, includeTagNotes) { + state.includeTagNotes = includeTagNotes; + }, }; diff --git a/app/assets/javascripts/releases/stores/modules/edit_new/state.js b/app/assets/javascripts/releases/stores/modules/edit_new/state.js index 315d07ac664..9f8146997c1 100644 --- a/app/assets/javascripts/releases/stores/modules/edit_new/state.js +++ b/app/assets/javascripts/releases/stores/modules/edit_new/state.js @@ -9,6 +9,7 @@ export default ({ manageMilestonesPath, newMilestonePath, releasesPagePath, + editReleaseDocsPath, tagName = null, defaultBranch = null, @@ -23,6 +24,7 @@ export default ({ manageMilestonesPath, newMilestonePath, releasesPagePath, + editReleaseDocsPath, /** * The name of the tag associated with the release, provided by the backend. @@ -48,4 +50,7 @@ export default ({ isUpdatingRelease: false, updateError: null, + + tagNotes: '', + includeTagNotes: false, }); |