diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2020-11-10 12:08:45 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2020-11-10 12:08:45 +0300 |
commit | 01c201bc6a9b99e1f3095f4139110c6fd0cf7aa9 (patch) | |
tree | 7445a1fc4797d9f093c3b1352cf3889fadc6d967 /app/assets/javascripts/design_management | |
parent | 552db97a0dfa486b751a808eb4e9fadc8b875e9c (diff) |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'app/assets/javascripts/design_management')
3 files changed, 57 insertions, 160 deletions
diff --git a/app/assets/javascripts/design_management/components/upload/design_dropzone.vue b/app/assets/javascripts/design_management/components/upload/design_dropzone.vue deleted file mode 100644 index 44f6b8bf32d..00000000000 --- a/app/assets/javascripts/design_management/components/upload/design_dropzone.vue +++ /dev/null @@ -1,147 +0,0 @@ -<script> -import { GlIcon, GlLink, GlSprintf } from '@gitlab/ui'; -import createFlash from '~/flash'; -import uploadDesignMutation from '../../graphql/mutations/upload_design.mutation.graphql'; -import { UPLOAD_DESIGN_INVALID_FILETYPE_ERROR } from '../../utils/error_messages'; -import { isValidDesignFile } from '../../utils/design_management_utils'; -import { VALID_DATA_TRANSFER_TYPE, VALID_DESIGN_FILE_MIMETYPE } from '../../constants'; - -export default { - components: { - GlIcon, - GlLink, - GlSprintf, - }, - props: { - hasDesigns: { - type: Boolean, - required: true, - }, - isDraggingDesign: { - type: Boolean, - required: false, - default: false, - }, - }, - data() { - return { - dragCounter: 0, - isDragDataValid: false, - }; - }, - computed: { - dragging() { - return this.dragCounter !== 0; - }, - iconStyles() { - return { - size: this.hasDesigns ? 24 : 16, - class: this.hasDesigns ? 'gl-mb-2' : 'gl-mr-3 gl-text-gray-500', - }; - }, - }, - methods: { - isValidUpload(files) { - return files.every(isValidDesignFile); - }, - isValidDragDataType({ dataTransfer }) { - return Boolean(dataTransfer && dataTransfer.types.some(t => t === VALID_DATA_TRANSFER_TYPE)); - }, - ondrop({ dataTransfer = {} }) { - this.dragCounter = 0; - // User already had feedback when dropzone was active, so bail here - if (!this.isDragDataValid) { - return; - } - - const { files } = dataTransfer; - if (!this.isValidUpload(Array.from(files))) { - createFlash({ message: UPLOAD_DESIGN_INVALID_FILETYPE_ERROR }); - return; - } - - this.$emit('change', files); - }, - ondragenter(e) { - this.dragCounter += 1; - this.isDragDataValid = this.isValidDragDataType(e); - }, - ondragleave() { - this.dragCounter -= 1; - }, - openFileUpload() { - this.$refs.fileUpload.click(); - }, - onDesignInputChange(e) { - this.$emit('change', e.target.files); - }, - }, - uploadDesignMutation, - VALID_DESIGN_FILE_MIMETYPE, -}; -</script> - -<template> - <div - class="gl-w-full gl-relative" - @dragstart.prevent.stop - @dragend.prevent.stop - @dragover.prevent.stop - @dragenter.prevent.stop="ondragenter" - @dragleave.prevent.stop="ondragleave" - @drop.prevent.stop="ondrop" - > - <slot> - <button - class="card design-dropzone-card design-dropzone-border gl-w-full gl-h-full gl-align-items-center gl-justify-content-center gl-p-3" - @click="openFileUpload" - > - <div - :class="{ 'gl-flex-direction-column': hasDesigns }" - class="gl-display-flex gl-align-items-center gl-justify-content-center gl-text-center" - data-testid="dropzone-area" - > - <gl-icon name="upload" :size="iconStyles.size" :class="iconStyles.class" /> - <p class="gl-mb-0"> - <gl-sprintf :message="__('Drop or %{linkStart}upload%{linkEnd} designs to attach')"> - <template #link="{ content }"> - <gl-link @click.stop="openFileUpload"> - {{ content }} - </gl-link> - </template> - </gl-sprintf> - </p> - </div> - </button> - - <input - ref="fileUpload" - type="file" - name="design_file" - :accept="$options.VALID_DESIGN_FILE_MIMETYPE.mimetype" - class="hide" - multiple - @change="onDesignInputChange" - /> - </slot> - <transition name="design-dropzone-fade"> - <div - v-show="dragging && !isDraggingDesign" - class="card design-dropzone-border design-dropzone-overlay gl-w-full gl-h-full gl-absolute gl-display-flex gl-align-items-center gl-justify-content-center gl-p-3 gl-bg-white" - > - <div v-show="!isDragDataValid" class="mw-50 gl-text-center"> - <h3 :class="{ 'gl-font-base gl-display-inline': !hasDesigns }">{{ __('Oh no!') }}</h3> - <span>{{ - __( - 'You are trying to upload something other than an image. Please upload a .png, .jpg, .jpeg, .gif, .bmp, .tiff or .ico.', - ) - }}</span> - </div> - <div v-show="isDragDataValid" class="mw-50 gl-text-center"> - <h3 :class="{ 'gl-font-base gl-display-inline': !hasDesigns }">{{ __('Incoming!') }}</h3> - <span>{{ __('Drop your designs to start your upload.') }}</span> - </div> - </div> - </transition> - </div> -</template> diff --git a/app/assets/javascripts/design_management/constants.js b/app/assets/javascripts/design_management/constants.js index 63a92ef5ec0..92928ca429f 100644 --- a/app/assets/javascripts/design_management/constants.js +++ b/app/assets/javascripts/design_management/constants.js @@ -5,9 +5,6 @@ export const VALID_DESIGN_FILE_MIMETYPE = { regex: /image\/.+/, }; -// https://developer.mozilla.org/en-US/docs/Web/API/DataTransfer/types -export const VALID_DATA_TRANSFER_TYPE = 'Files'; - export const ACTIVE_DISCUSSION_SOURCE_TYPES = { pin: 'pin', discussion: 'discussion', diff --git a/app/assets/javascripts/design_management/pages/index.vue b/app/assets/javascripts/design_management/pages/index.vue index ad5d300b804..ea404692840 100644 --- a/app/assets/javascripts/design_management/pages/index.vue +++ b/app/assets/javascripts/design_management/pages/index.vue @@ -1,17 +1,17 @@ <script> -import { GlLoadingIcon, GlButton, GlAlert } from '@gitlab/ui'; +import { GlLoadingIcon, GlButton, GlAlert, GlLink, GlSprintf } from '@gitlab/ui'; import VueDraggable from 'vuedraggable'; import getDesignListQuery from 'shared_queries/design_management/get_design_list.query.graphql'; import permissionsQuery from 'shared_queries/design_management/design_permissions.query.graphql'; import createFlash, { FLASH_TYPES } from '~/flash'; -import { s__, sprintf } from '~/locale'; +import { __, s__, sprintf } from '~/locale'; import { getFilename } from '~/lib/utils/file_upload'; import UploadButton from '../components/upload/button.vue'; import DeleteButton from '../components/delete_button.vue'; import Design from '../components/list/item.vue'; import DesignDestroyer from '../components/design_destroyer.vue'; import DesignVersionDropdown from '../components/upload/design_version_dropdown.vue'; -import DesignDropzone from '../components/upload/design_dropzone.vue'; +import DesignDropzone from '~/vue_shared/components/upload_dropzone/upload_dropzone.vue'; import uploadDesignMutation from '../graphql/mutations/upload_design.mutation.graphql'; import moveDesignMutation from '../graphql/mutations/move_design.mutation.graphql'; import allDesignsMixin from '../mixins/all_designs'; @@ -20,6 +20,7 @@ import { EXISTING_DESIGN_DROP_MANY_FILES_MESSAGE, EXISTING_DESIGN_DROP_INVALID_FILENAME_MESSAGE, MOVE_DESIGN_ERROR, + UPLOAD_DESIGN_INVALID_FILETYPE_ERROR, designUploadSkippedWarning, designDeletionError, } from '../utils/error_messages'; @@ -34,6 +35,7 @@ import { } from '../utils/design_management_utils'; import { trackDesignCreate, trackDesignUpdate } from '../utils/tracking'; import { DESIGNS_ROUTE_NAME } from '../router/constants'; +import { VALID_DESIGN_FILE_MIMETYPE } from '../constants'; const MAXIMUM_FILE_UPLOAD_LIMIT = 10; @@ -42,6 +44,8 @@ export default { GlLoadingIcon, GlAlert, GlButton, + GlSprintf, + GlLink, UploadButton, Design, DesignDestroyer, @@ -50,6 +54,11 @@ export default { DesignDropzone, VueDraggable, }, + dropzoneProps: { + dropToStartMessage: __('Drop your designs to start your upload.'), + isFileValid: isValidDesignFile, + validFileMimetypes: [VALID_DESIGN_FILE_MIMETYPE.mimetype], + }, mixins: [allDesignsMixin], apollo: { permissions: { @@ -247,6 +256,9 @@ export default { const errorMessage = designDeletionError({ singular: this.selectedDesigns.length === 1 }); createFlash({ message: errorMessage }); }, + onDesignDropzoneError() { + createFlash({ message: UPLOAD_DESIGN_INVALID_FILETYPE_ERROR }); + }, onExistingDesignDropzoneChange(files, existingDesignFilename) { const filesArr = Array.from(files); @@ -325,6 +337,9 @@ export default { animation: 200, ghostClass: 'gl-visibility-hidden', }, + i18n: { + dropzoneDescriptionText: __('Drop or %{linkStart}upload%{linkEnd} designs to attach'), + }, }; </script> @@ -335,7 +350,11 @@ export default { @mouseenter="toggleOnPasteListener" @mouseleave="toggleOffPasteListener" > - <header v-if="showToolbar" class="row-content-block gl-border-t-0 gl-p-3 gl-display-flex"> + <header + v-if="showToolbar" + class="row-content-block gl-border-t-0 gl-p-3 gl-display-flex" + data-testid="design-toolbar-wrapper" + > <div class="gl-display-flex gl-justify-content-space-between gl-align-items-center gl-w-full"> <div> <span class="gl-font-weight-bold gl-mr-3">{{ s__('DesignManagement|Designs') }}</span> @@ -371,7 +390,12 @@ export default { {{ s__('DesignManagement|Archive selected') }} </delete-button> </design-destroyer> - <upload-button v-if="canCreateDesign" :is-saving="isSaving" @upload="onUploadDesign" /> + <upload-button + v-if="canCreateDesign" + :is-saving="isSaving" + data-testid="design-upload-button" + @upload="onUploadDesign" + /> </div> </div> </header> @@ -414,15 +438,26 @@ export default { class="col-md-6 col-lg-3 gl-mb-3 gl-bg-transparent gl-shadow-none js-design-tile" > <design-dropzone - :has-designs="hasDesigns" - :is-dragging-design="isDraggingDesign" + :display-as-card="hasDesigns" + :enable-drag-behavior="isDraggingDesign" + v-bind="$options.dropzoneProps" @change="onExistingDesignDropzoneChange($event, design.filename)" + @error="onDesignDropzoneError" > <design v-bind="design" :is-uploading="isDesignToBeSaved(design.filename)" class="gl-bg-white" /> + <template #upload-text="{ openFileUpload }"> + <gl-sprintf :message="$options.i18n.dropzoneDescriptionText"> + <template #link="{ content }"> + <gl-link @click.stop="openFileUpload"> + {{ content }} + </gl-link> + </template> + </gl-sprintf> + </template> </design-dropzone> <input @@ -438,12 +473,24 @@ export default { <template #header> <li :class="designDropzoneWrapperClass" data-testid="design-dropzone-wrapper"> <design-dropzone - :is-dragging-design="isDraggingDesign" + :enable-drag-behavior="isDraggingDesign" :class="{ 'design-list-item design-list-item-new': !isDesignListEmpty }" - :has-designs="hasDesigns" + :display-as-card="hasDesigns" + v-bind="$options.dropzoneProps" data-qa-selector="design_dropzone_content" @change="onUploadDesign" - /> + @error="onDesignDropzoneError" + > + <template #upload-text="{ openFileUpload }"> + <gl-sprintf :message="$options.i18n.dropzoneDescriptionText"> + <template #link="{ content }"> + <gl-link @click.stop="openFileUpload"> + {{ content }} + </gl-link> + </template> + </gl-sprintf> + </template> + </design-dropzone> </li> </template> </vue-draggable> |