summaryrefslogtreecommitdiff
path: root/app/assets/javascripts/repository
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2020-10-21 07:08:36 +0000
committerGitLab Bot <gitlab-bot@gitlab.com>2020-10-21 07:08:36 +0000
commit48aff82709769b098321c738f3444b9bdaa694c6 (patch)
treee00c7c43e2d9b603a5a6af576b1685e400410dee /app/assets/javascripts/repository
parent879f5329ee916a948223f8f43d77fba4da6cd028 (diff)
downloadgitlab-ce-4d844e2fbf8315eaf3fddb9a0b241a909be3ecbf.tar.gz
Add latest changes from gitlab-org/gitlab@13-5-stable-eev13.5.0-rc42
Diffstat (limited to 'app/assets/javascripts/repository')
-rw-r--r--app/assets/javascripts/repository/components/breadcrumbs.vue26
-rw-r--r--app/assets/javascripts/repository/components/last_commit.vue32
-rw-r--r--app/assets/javascripts/repository/components/preview/index.vue5
-rw-r--r--app/assets/javascripts/repository/components/tree_content.vue5
-rw-r--r--app/assets/javascripts/repository/index.js86
-rw-r--r--app/assets/javascripts/repository/log_tree.js22
-rw-r--r--app/assets/javascripts/repository/queries/path_last_commit.query.graphql38
-rw-r--r--app/assets/javascripts/repository/utils/icon.js98
8 files changed, 95 insertions, 217 deletions
diff --git a/app/assets/javascripts/repository/components/breadcrumbs.vue b/app/assets/javascripts/repository/components/breadcrumbs.vue
index 74437f286b4..677cb265942 100644
--- a/app/assets/javascripts/repository/components/breadcrumbs.vue
+++ b/app/assets/javascripts/repository/components/breadcrumbs.vue
@@ -1,9 +1,9 @@
<script>
import {
- GlDeprecatedDropdown,
- GlDeprecatedDropdownDivider,
- GlDeprecatedDropdownHeader,
- GlDeprecatedDropdownItem,
+ GlDropdown,
+ GlDropdownDivider,
+ GlDropdownSectionHeader,
+ GlDropdownItem,
GlIcon,
} from '@gitlab/ui';
import { joinPaths, escapeFileUrl } from '~/lib/utils/url_utility';
@@ -20,10 +20,10 @@ const ROW_TYPES = {
export default {
components: {
- GlDeprecatedDropdown,
- GlDeprecatedDropdownDivider,
- GlDeprecatedDropdownHeader,
- GlDeprecatedDropdownItem,
+ GlDropdown,
+ GlDropdownDivider,
+ GlDropdownSectionHeader,
+ GlDropdownItem,
GlIcon,
},
apollo: {
@@ -226,11 +226,11 @@ export default {
getComponent(type) {
switch (type) {
case ROW_TYPES.divider:
- return 'gl-deprecated-dropdown-divider';
+ return 'gl-dropdown-divider';
case ROW_TYPES.header:
- return 'gl-deprecated-dropdown-header';
+ return 'gl-dropdown-section-header';
default:
- return 'gl-deprecated-dropdown-item';
+ return 'gl-dropdown-item';
}
},
},
@@ -246,7 +246,7 @@ export default {
</router-link>
</li>
<li v-if="renderAddToTreeDropdown" class="breadcrumb-item">
- <gl-deprecated-dropdown toggle-class="add-to-tree qa-add-to-tree ml-1">
+ <gl-dropdown toggle-class="add-to-tree qa-add-to-tree gl-ml-2">
<template #button-content>
<span class="sr-only">{{ __('Add to tree') }}</span>
<gl-icon name="plus" :size="16" class="float-left" />
@@ -257,7 +257,7 @@ export default {
{{ item.text }}
</component>
</template>
- </gl-deprecated-dropdown>
+ </gl-dropdown>
</li>
</ol>
</nav>
diff --git a/app/assets/javascripts/repository/components/last_commit.vue b/app/assets/javascripts/repository/components/last_commit.vue
index 59831890a4e..0e2bccfabdd 100644
--- a/app/assets/javascripts/repository/components/last_commit.vue
+++ b/app/assets/javascripts/repository/components/last_commit.vue
@@ -1,7 +1,8 @@
<script>
/* eslint-disable vue/no-v-html */
-import { GlTooltipDirective, GlLink, GlDeprecatedButton, GlLoadingIcon, GlIcon } from '@gitlab/ui';
+import { GlTooltipDirective, GlLink, GlButton, GlButtonGroup, GlLoadingIcon } from '@gitlab/ui';
import defaultAvatarUrl from 'images/no_avatar.png';
+import pathLastCommitQuery from 'shared_queries/repository/path_last_commit.query.graphql';
import { sprintf, s__ } from '~/locale';
import UserAvatarLink from '../../vue_shared/components/user_avatar/user_avatar_link.vue';
import TimeagoTooltip from '../../vue_shared/components/time_ago_tooltip.vue';
@@ -9,17 +10,16 @@ import CiIcon from '../../vue_shared/components/ci_icon.vue';
import ClipboardButton from '../../vue_shared/components/clipboard_button.vue';
import getRefMixin from '../mixins/get_ref';
import projectPathQuery from '../queries/project_path.query.graphql';
-import pathLastCommitQuery from '../queries/path_last_commit.query.graphql';
export default {
components: {
- GlIcon,
UserAvatarLink,
TimeagoTooltip,
ClipboardButton,
CiIcon,
+ GlButton,
+ GlButtonGroup,
GlLink,
- GlDeprecatedButton,
GlLoadingIcon,
},
directives: {
@@ -123,15 +123,14 @@ export default {
class="commit-row-message item-title"
v-html="commit.titleHtml"
/>
- <gl-deprecated-button
+ <gl-button
v-if="commit.descriptionHtml"
:class="{ open: showDescription }"
:aria-label="__('Show commit description')"
- class="text-expander"
+ class="text-expander gl-vertical-align-bottom!"
+ icon="ellipsis_h"
@click="toggleShowDescription"
- >
- <gl-icon name="ellipsis_h" :size="10" />
- </gl-deprecated-button>
+ />
<div class="committer">
<gl-link
v-if="commit.author"
@@ -169,16 +168,19 @@ export default {
/>
</gl-link>
</div>
- <div class="commit-sha-group d-flex">
- <div class="label label-monospace monospace">
- {{ showCommitId }}
- </div>
+ <gl-button-group class="gl-ml-4 js-commit-sha-group">
+ <gl-button
+ label
+ class="gl-font-monospace"
+ data-testid="last-commit-id-label"
+ v-text="showCommitId"
+ />
<clipboard-button
:text="commit.sha"
:title="__('Copy commit SHA')"
- tooltip-placement="bottom"
+ class="input-group-text"
/>
- </div>
+ </gl-button-group>
</div>
</div>
</template>
diff --git a/app/assets/javascripts/repository/components/preview/index.vue b/app/assets/javascripts/repository/components/preview/index.vue
index eca53f73a7f..4e2c8332f37 100644
--- a/app/assets/javascripts/repository/components/preview/index.vue
+++ b/app/assets/javascripts/repository/components/preview/index.vue
@@ -2,7 +2,7 @@
/* eslint-disable vue/no-v-html */
import $ from 'jquery';
import '~/behaviors/markdown/render_gfm';
-import { GlLink, GlLoadingIcon } from '@gitlab/ui';
+import { GlIcon, GlLink, GlLoadingIcon } from '@gitlab/ui';
import { handleLocationHash } from '~/lib/utils/common_utils';
import readmeQuery from '../../queries/readme.query.graphql';
@@ -19,6 +19,7 @@ export default {
},
},
components: {
+ GlIcon,
GlLink,
GlLoadingIcon,
},
@@ -51,7 +52,7 @@ export default {
<article class="file-holder limited-width-container readme-holder">
<div class="js-file-title file-title-flex-parent">
<div class="file-header-content">
- <i aria-hidden="true" class="fa fa-file-text-o fa-fw"></i>
+ <gl-icon name="doc-text" aria-hidden="true" />
<gl-link :href="blob.webPath">
<strong>{{ blob.name }}</strong>
</gl-link>
diff --git a/app/assets/javascripts/repository/components/tree_content.vue b/app/assets/javascripts/repository/components/tree_content.vue
index 365b6cbb550..78b8baaa75e 100644
--- a/app/assets/javascripts/repository/components/tree_content.vue
+++ b/app/assets/javascripts/repository/components/tree_content.vue
@@ -75,6 +75,7 @@ export default {
},
methods: {
fetchFiles() {
+ const originalPath = this.path || '/';
this.isLoadingFiles = true;
return this.$apollo
@@ -83,14 +84,14 @@ export default {
variables: {
projectPath: this.projectPath,
ref: this.ref,
- path: this.path || '/',
+ path: originalPath,
nextPageCursor: this.nextPageCursor,
pageSize: this.pageSize,
},
})
.then(({ data }) => {
if (data.errors) throw data.errors;
- if (!data?.project?.repository) return;
+ if (!data?.project?.repository || originalPath !== (this.path || '/')) return;
const pageInfo = this.hasNextPage(data.project.repository.tree);
diff --git a/app/assets/javascripts/repository/index.js b/app/assets/javascripts/repository/index.js
index 7f72524b6fe..a62b2d96c54 100644
--- a/app/assets/javascripts/repository/index.js
+++ b/app/assets/javascripts/repository/index.js
@@ -1,16 +1,17 @@
import Vue from 'vue';
-import { escapeFileUrl, joinPaths, webIDEUrl } from '../lib/utils/url_utility';
+import PathLastCommitQuery from 'shared_queries/repository/path_last_commit.query.graphql';
+import { escapeFileUrl } from '../lib/utils/url_utility';
import createRouter from './router';
import App from './components/app.vue';
import Breadcrumbs from './components/breadcrumbs.vue';
import LastCommit from './components/last_commit.vue';
import TreeActionLink from './components/tree_action_link.vue';
-import WebIdeLink from '~/vue_shared/components/web_ide_link.vue';
+import initWebIdeLink from '~/pages/projects/shared/web_ide_link';
import DirectoryDownloadLinks from './components/directory_download_links.vue';
import apolloProvider from './graphql';
import { setTitle } from './utils/title';
import { updateFormAction } from './utils/dom';
-import { convertObjectPropsToCamelCase, parseBoolean } from '../lib/utils/common_utils';
+import { parseBoolean } from '../lib/utils/common_utils';
import { __ } from '../locale';
export default function setupVueRepositoryList() {
@@ -18,6 +19,10 @@ export default function setupVueRepositoryList() {
const { dataset } = el;
const { projectPath, projectShortPath, ref, escapedRef, fullName } = dataset;
const router = createRouter(projectPath, escapedRef);
+ const pathRegex = /-\/tree\/[^/]+\/(.+$)/;
+ const matches = window.location.href.match(pathRegex);
+
+ const currentRoutePath = matches ? matches[1] : '';
apolloProvider.clients.defaultClient.cache.writeData({
data: {
@@ -29,6 +34,43 @@ export default function setupVueRepositoryList() {
},
});
+ const initLastCommitApp = () =>
+ new Vue({
+ el: document.getElementById('js-last-commit'),
+ router,
+ apolloProvider,
+ render(h) {
+ return h(LastCommit, {
+ props: {
+ currentPath: this.$route.params.path,
+ },
+ });
+ },
+ });
+
+ if (window.gl.startup_graphql_calls) {
+ const query = window.gl.startup_graphql_calls.find(
+ call => call.operationName === 'pathLastCommit',
+ );
+ query.fetchCall
+ .then(res => res.json())
+ .then(res => {
+ apolloProvider.clients.defaultClient.writeQuery({
+ query: PathLastCommitQuery,
+ data: res.data,
+ variables: {
+ projectPath,
+ ref,
+ path: currentRoutePath,
+ },
+ });
+ })
+ .catch(() => {})
+ .finally(() => initLastCommitApp());
+ } else {
+ initLastCommitApp();
+ }
+
router.afterEach(({ params: { path } }) => {
setTitle(path, ref, fullName);
});
@@ -77,20 +119,6 @@ export default function setupVueRepositoryList() {
});
}
- // eslint-disable-next-line no-new
- new Vue({
- el: document.getElementById('js-last-commit'),
- router,
- apolloProvider,
- render(h) {
- return h(LastCommit, {
- props: {
- currentPath: this.$route.params.path,
- },
- });
- },
- });
-
const treeHistoryLinkEl = document.getElementById('js-tree-history-link');
const { historyLink } = treeHistoryLinkEl.dataset;
@@ -110,29 +138,7 @@ export default function setupVueRepositoryList() {
},
});
- const webIdeLinkEl = document.getElementById('js-tree-web-ide-link');
-
- if (webIdeLinkEl) {
- const { ideBasePath, ...options } = convertObjectPropsToCamelCase(
- JSON.parse(webIdeLinkEl.dataset.options),
- );
-
- // eslint-disable-next-line no-new
- new Vue({
- el: webIdeLinkEl,
- router,
- render(h) {
- return h(WebIdeLink, {
- props: {
- webIdeUrl: webIDEUrl(
- joinPaths('/', ideBasePath, 'edit', ref, '-', this.$route.params.path || '', '/'),
- ),
- ...options,
- },
- });
- },
- });
- }
+ initWebIdeLink({ el: document.getElementById('js-tree-web-ide-link'), router });
const directoryDownloadLinks = document.getElementById('js-directory-downloads');
diff --git a/app/assets/javascripts/repository/log_tree.js b/app/assets/javascripts/repository/log_tree.js
index 361e0b62bb7..fc8fa40a855 100644
--- a/app/assets/javascripts/repository/log_tree.js
+++ b/app/assets/javascripts/repository/log_tree.js
@@ -5,8 +5,8 @@ import commitsQuery from './queries/commits.query.graphql';
import projectPathQuery from './queries/project_path.query.graphql';
import refQuery from './queries/ref.query.graphql';
-let fetchpromise;
-let resolvers = [];
+const fetchpromises = {};
+const resolvers = {};
export function resolveCommit(commits, path, { resolve, entry }) {
const commit = commits.find(c => c.filePath === `${path}/${entry.name}` && c.type === entry.type);
@@ -18,15 +18,19 @@ export function resolveCommit(commits, path, { resolve, entry }) {
export function fetchLogsTree(client, path, offset, resolver = null) {
if (resolver) {
- resolvers.push(resolver);
+ if (!resolvers[path]) {
+ resolvers[path] = [resolver];
+ } else {
+ resolvers[path].push(resolver);
+ }
}
- if (fetchpromise) return fetchpromise;
+ if (fetchpromises[path]) return fetchpromises[path];
const { projectPath } = client.readQuery({ query: projectPathQuery });
const { escapedRef } = client.readQuery({ query: refQuery });
- fetchpromise = axios
+ fetchpromises[path] = axios
.get(
`${gon.relative_url_root}/${projectPath}/-/refs/${escapedRef}/logs_tree/${encodeURIComponent(
path.replace(/^\//, ''),
@@ -46,16 +50,16 @@ export function fetchLogsTree(client, path, offset, resolver = null) {
data,
});
- resolvers.forEach(r => resolveCommit(data.commits, path, r));
+ resolvers[path].forEach(r => resolveCommit(data.commits, path, r));
- fetchpromise = null;
+ delete fetchpromises[path];
if (headerLogsOffset) {
fetchLogsTree(client, path, headerLogsOffset);
} else {
- resolvers = [];
+ delete resolvers[path];
}
});
- return fetchpromise;
+ return fetchpromises[path];
}
diff --git a/app/assets/javascripts/repository/queries/path_last_commit.query.graphql b/app/assets/javascripts/repository/queries/path_last_commit.query.graphql
deleted file mode 100644
index 51f3f790a5d..00000000000
--- a/app/assets/javascripts/repository/queries/path_last_commit.query.graphql
+++ /dev/null
@@ -1,38 +0,0 @@
-query pathLastCommit($projectPath: ID!, $path: String, $ref: String!) {
- project(fullPath: $projectPath) {
- repository {
- tree(path: $path, ref: $ref) {
- lastCommit {
- sha
- title
- titleHtml
- descriptionHtml
- message
- webPath
- authoredDate
- authorName
- authorGravatar
- author {
- name
- avatarUrl
- webPath
- }
- signatureHtml
- pipelines(ref: $ref, first: 1) {
- edges {
- node {
- detailedStatus {
- detailsPath
- icon
- tooltip
- text
- group
- }
- }
- }
- }
- }
- }
- }
- }
-}
diff --git a/app/assets/javascripts/repository/utils/icon.js b/app/assets/javascripts/repository/utils/icon.js
deleted file mode 100644
index 47b045c7eaf..00000000000
--- a/app/assets/javascripts/repository/utils/icon.js
+++ /dev/null
@@ -1,98 +0,0 @@
-const entryTypeIcons = {
- tree: 'folder',
- commit: 'archive',
-};
-
-const fileTypeIcons = [
- { extensions: ['pdf'], name: 'file-pdf-o' },
- {
- extensions: [
- 'jpg',
- 'jpeg',
- 'jif',
- 'jfif',
- 'jp2',
- 'jpx',
- 'j2k',
- 'j2c',
- 'png',
- 'gif',
- 'tif',
- 'tiff',
- 'svg',
- 'ico',
- 'bmp',
- ],
- name: 'file-image-o',
- },
- {
- extensions: ['zip', 'zipx', 'tar', 'gz', 'bz', 'bzip', 'xz', 'rar', '7z'],
- name: 'file-archive-o',
- },
- { extensions: ['mp3', 'wma', 'ogg', 'oga', 'wav', 'flac', 'aac'], name: 'file-audio-o' },
- {
- extensions: [
- 'mp4',
- 'm4p',
- 'm4v',
- 'mpg',
- 'mp2',
- 'mpeg',
- 'mpe',
- 'mpv',
- 'm2v',
- 'avi',
- 'mkv',
- 'flv',
- 'ogv',
- 'mov',
- '3gp',
- '3g2',
- ],
- name: 'file-video-o',
- },
- { extensions: ['doc', 'dot', 'docx', 'docm', 'dotx', 'dotm', 'docb'], name: 'file-word-o' },
- {
- extensions: [
- 'xls',
- 'xlt',
- 'xlm',
- 'xlsx',
- 'xlsm',
- 'xltx',
- 'xltm',
- 'xlsb',
- 'xla',
- 'xlam',
- 'xll',
- 'xlw',
- ],
- name: 'file-excel-o',
- },
- {
- extensions: [
- 'ppt',
- 'pot',
- 'pps',
- 'pptx',
- 'pptm',
- 'potx',
- 'potm',
- 'ppam',
- 'ppsx',
- 'ppsm',
- 'sldx',
- 'sldm',
- ],
- name: 'file-powerpoint-o',
- },
-];
-
-export const getIconName = (type, path) => {
- if (entryTypeIcons[type]) return entryTypeIcons[type];
-
- const extension = path.split('.').pop();
- const file = fileTypeIcons.find(t => t.extensions.some(ext => ext === extension));
-
- return file ? file.name : 'file-text-o';
-};