Commit 051daa03 authored by Phil Hughes's avatar Phil Hughes

Merge branch 'ee-37220-es-modules' into 'master'

Port of 37220-es-modules to EE

See merge request gitlab-org/gitlab-ee!2914
parents 7c627ac8 2328e10a
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
/* global Flash */ /* global Flash */
import _ from 'underscore'; import _ from 'underscore';
import Cookies from 'js-cookie'; import Cookies from 'js-cookie';
import { isInIssuePage, updateTooltipTitle } from './lib/utils/common_utils';
const animationEndEventString = 'animationend webkitAnimationEnd MSAnimationEnd oAnimationEnd'; const animationEndEventString = 'animationend webkitAnimationEnd MSAnimationEnd oAnimationEnd';
const transitionEndEventString = 'transitionend webkitTransitionEnd oTransitionEnd MSTransitionEnd'; const transitionEndEventString = 'transitionend webkitTransitionEnd oTransitionEnd MSTransitionEnd';
...@@ -237,7 +238,7 @@ class AwardsHandler { ...@@ -237,7 +238,7 @@ class AwardsHandler {
addAward(votesBlock, awardUrl, emoji, checkMutuality, callback) { addAward(votesBlock, awardUrl, emoji, checkMutuality, callback) {
const isMainAwardsBlock = votesBlock.closest('.js-issue-note-awards').length; const isMainAwardsBlock = votesBlock.closest('.js-issue-note-awards').length;
if (gl.utils.isInIssuePage() && !isMainAwardsBlock) { if (isInIssuePage() && !isMainAwardsBlock) {
const id = votesBlock.attr('id').replace('note_', ''); const id = votesBlock.attr('id').replace('note_', '');
$('.emoji-menu').removeClass('is-visible'); $('.emoji-menu').removeClass('is-visible');
...@@ -288,7 +289,7 @@ class AwardsHandler { ...@@ -288,7 +289,7 @@ class AwardsHandler {
} }
getVotesBlock() { getVotesBlock() {
if (gl.utils.isInIssuePage()) { if (isInIssuePage()) {
const $el = $('.js-add-award.is-active').closest('.note.timeline-entry'); const $el = $('.js-add-award.is-active').closest('.note.timeline-entry');
if ($el.length) { if ($el.length) {
...@@ -452,11 +453,11 @@ class AwardsHandler { ...@@ -452,11 +453,11 @@ class AwardsHandler {
userAuthored($emojiButton) { userAuthored($emojiButton) {
const oldTitle = this.getAwardTooltip($emojiButton); const oldTitle = this.getAwardTooltip($emojiButton);
const newTitle = 'You cannot vote on your own issue, MR and note'; const newTitle = 'You cannot vote on your own issue, MR and note';
gl.utils.updateTooltipTitle($emojiButton, newTitle).tooltip('show'); updateTooltipTitle($emojiButton, newTitle).tooltip('show');
// Restore tooltip back to award list // Restore tooltip back to award list
return setTimeout(() => { return setTimeout(() => {
$emojiButton.tooltip('hide'); $emojiButton.tooltip('hide');
gl.utils.updateTooltipTitle($emojiButton, oldTitle); updateTooltipTitle($emojiButton, oldTitle);
}, 2800); }, 2800);
} }
......
import '../commons/bootstrap'; import '../commons/bootstrap';
import { isInIssuePage } from '../lib/utils/common_utils';
// Quick Submit behavior // Quick Submit behavior
// //
...@@ -45,7 +46,7 @@ $(document).on('keydown.quick_submit', '.js-quick-submit', (e) => { ...@@ -45,7 +46,7 @@ $(document).on('keydown.quick_submit', '.js-quick-submit', (e) => {
if (!$submitButton.attr('disabled')) { if (!$submitButton.attr('disabled')) {
$submitButton.trigger('click', [e]); $submitButton.trigger('click', [e]);
if (!gl.utils.isInIssuePage()) { if (!isInIssuePage()) {
$submitButton.disable(); $submitButton.disable();
} }
} }
......
/* global Flash */ /* global Flash */
import { handleLocationHash } from '../../lib/utils/common_utils';
export default class BlobViewer { export default class BlobViewer {
constructor() { constructor() {
BlobViewer.initAuxiliaryViewer(); BlobViewer.initAuxiliaryViewer();
...@@ -114,7 +116,7 @@ export default class BlobViewer { ...@@ -114,7 +116,7 @@ export default class BlobViewer {
$(viewer).renderGFM(); $(viewer).renderGFM();
this.$fileHolder.trigger('highlight:line'); this.$fileHolder.trigger('highlight:line');
gl.utils.handleLocationHash(); handleLocationHash();
this.toggleCopyButtonState(); this.toggleCopyButtonState();
}) })
......
...@@ -24,6 +24,7 @@ import './components/board_sidebar'; ...@@ -24,6 +24,7 @@ import './components/board_sidebar';
import './components/new_list_dropdown'; import './components/new_list_dropdown';
import './components/modal/index'; import './components/modal/index';
import '../vue_shared/vue_resource_interceptor'; import '../vue_shared/vue_resource_interceptor';
import { convertPermissionToBoolean } from '../lib/utils/common_utils';
import './components/boards_selector'; import './components/boards_selector';
import collapseIcon from './icons/fullscreen_collapse.svg'; import collapseIcon from './icons/fullscreen_collapse.svg';
...@@ -153,10 +154,10 @@ $(() => { ...@@ -153,10 +154,10 @@ $(() => {
modal: ModalStore.store, modal: ModalStore.store,
store: Store.state, store: Store.state,
isFullscreen: false, isFullscreen: false,
focusModeAvailable: gl.utils.convertPermissionToBoolean( focusModeAvailable: convertPermissionToBoolean(
$boardApp.dataset.focusModeAvailable, $boardApp.dataset.focusModeAvailable,
), ),
canAdminList: this.$options.el && gl.utils.convertPermissionToBoolean( canAdminList: this.$options.el && convertPermissionToBoolean(
this.$options.el.dataset.canAdminList, this.$options.el.dataset.canAdminList,
), ),
}; };
...@@ -226,7 +227,7 @@ $(() => { ...@@ -226,7 +227,7 @@ $(() => {
modal: ModalStore.store, modal: ModalStore.store,
store: Store.state, store: Store.state,
isFullscreen: false, isFullscreen: false,
focusModeAvailable: gl.utils.convertPermissionToBoolean($boardApp.dataset.focusModeAvailable), focusModeAvailable: convertPermissionToBoolean($boardApp.dataset.focusModeAvailable),
}, },
methods: { methods: {
toggleFocusMode() { toggleFocusMode() {
......
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
import _ from 'underscore'; import _ from 'underscore';
import Cookies from 'js-cookie'; import Cookies from 'js-cookie';
import boardsStoreEE from 'ee/boards/stores/boards_store_ee'; import boardsStoreEE from 'ee/boards/stores/boards_store_ee';
import { getUrlParamsArray } from '../../lib/utils/common_utils';
window.gl = window.gl || {}; window.gl = window.gl || {};
window.gl.issueBoards = window.gl.issueBoards || {}; window.gl.issueBoards = window.gl.issueBoards || {};
...@@ -22,7 +23,7 @@ gl.issueBoards.BoardsStore = { ...@@ -22,7 +23,7 @@ gl.issueBoards.BoardsStore = {
}, },
create () { create () {
this.state.lists = []; this.state.lists = [];
this.filter.path = gl.utils.getUrlParamsArray().join('&'); this.filter.path = getUrlParamsArray().join('&');
this.detail = { issue: {} }; this.detail = { issue: {} };
}, },
createNewListDropdownData() { createNewListDropdownData() {
......
...@@ -3,6 +3,7 @@ consistent-return, prefer-rest-params */ ...@@ -3,6 +3,7 @@ consistent-return, prefer-rest-params */
import _ from 'underscore'; import _ from 'underscore';
import bp from './breakpoints'; import bp from './breakpoints';
import { bytesToKiB } from './lib/utils/number_utils'; import { bytesToKiB } from './lib/utils/number_utils';
import { setCiStatusFavicon } from './lib/utils/common_utils';
window.Build = (function () { window.Build = (function () {
Build.timeout = null; Build.timeout = null;
...@@ -169,7 +170,7 @@ window.Build = (function () { ...@@ -169,7 +170,7 @@ window.Build = (function () {
data: this.state, data: this.state,
}) })
.done((log) => { .done((log) => {
gl.utils.setCiStatusFavicon(`${this.pageUrl}/status.json`); setCiStatusFavicon(`${this.pageUrl}/status.json`);
if (log.state) { if (log.state) {
this.state = log.state; this.state = log.state;
......
/* eslint-disable func-names, space-before-function-paren, wrap-iife, one-var, no-var, camelcase, one-var-declaration-per-line, no-else-return, max-len */ /* eslint-disable func-names, space-before-function-paren, wrap-iife, one-var, no-var, camelcase, one-var-declaration-per-line, no-else-return, max-len */
import { rstrip } from './lib/utils/common_utils';
window.ConfirmDangerModal = (function() { window.ConfirmDangerModal = (function() {
function ConfirmDangerModal(form, text, arg) { function ConfirmDangerModal(form, text, arg) {
...@@ -16,7 +17,7 @@ window.ConfirmDangerModal = (function() { ...@@ -16,7 +17,7 @@ window.ConfirmDangerModal = (function() {
submit.disable(); submit.disable();
$('.js-confirm-danger-input').off('input'); $('.js-confirm-danger-input').off('input');
$('.js-confirm-danger-input').on('input', function() { $('.js-confirm-danger-input').on('input', function() {
if (gl.utils.rstrip($(this).val()) === project_path) { if (rstrip($(this).val()) === project_path) {
return submit.enable(); return submit.enable();
} else { } else {
return submit.disable(); return submit.disable();
......
/* eslint-disable class-methods-use-this, object-shorthand, no-unused-vars, no-use-before-define, no-new, max-len, no-restricted-syntax, guard-for-in, no-continue */ /* eslint-disable class-methods-use-this, object-shorthand, no-unused-vars, no-use-before-define, no-new, max-len, no-restricted-syntax, guard-for-in, no-continue */
import _ from 'underscore'; import _ from 'underscore';
import './lib/utils/common_utils'; import { insertText, getSelectedFragment, nodeMatchesSelector } from './lib/utils/common_utils';
import { placeholderImage } from './lazy_loader'; import { placeholderImage } from './lazy_loader';
const gfmRules = { const gfmRules = {
...@@ -295,7 +295,7 @@ class CopyAsGFM { ...@@ -295,7 +295,7 @@ class CopyAsGFM {
const clipboardData = e.originalEvent.clipboardData; const clipboardData = e.originalEvent.clipboardData;
if (!clipboardData) return; if (!clipboardData) return;
const documentFragment = window.gl.utils.getSelectedFragment(); const documentFragment = getSelectedFragment();
if (!documentFragment) return; if (!documentFragment) return;
const el = transformer(documentFragment.cloneNode(true)); const el = transformer(documentFragment.cloneNode(true));
...@@ -412,7 +412,7 @@ class CopyAsGFM { ...@@ -412,7 +412,7 @@ class CopyAsGFM {
for (const selector in rules) { for (const selector in rules) {
const func = rules[selector]; const func = rules[selector];
if (!window.gl.utils.nodeMatchesSelector(node, selector)) continue; if (!nodeMatchesSelector(node, selector)) continue;
let result; let result;
if (func.length === 2) { if (func.length === 2) {
......
...@@ -83,6 +83,7 @@ import initProjectVisibilitySelector from './project_visibility'; ...@@ -83,6 +83,7 @@ import initProjectVisibilitySelector from './project_visibility';
import GpgBadges from './gpg_badges'; import GpgBadges from './gpg_badges';
import UserFeatureHelper from './helpers/user_feature_helper'; import UserFeatureHelper from './helpers/user_feature_helper';
import initChangesDropdown from './init_changes_dropdown'; import initChangesDropdown from './init_changes_dropdown';
import { ajaxGet, convertPermissionToBoolean } from './lib/utils/common_utils';
// EE-only // EE-only
import ApproversSelect from './approvers_select'; import ApproversSelect from './approvers_select';
...@@ -112,7 +113,7 @@ import initGroupAnalytics from './init_group_analytics'; ...@@ -112,7 +113,7 @@ import initGroupAnalytics from './init_group_analytics';
$('.js-gfm-input:not(.js-vue-textarea)').each((i, el) => { $('.js-gfm-input:not(.js-vue-textarea)').each((i, el) => {
const gfm = new GfmAutoComplete(gl.GfmAutoComplete && gl.GfmAutoComplete.dataSources); const gfm = new GfmAutoComplete(gl.GfmAutoComplete && gl.GfmAutoComplete.dataSources);
const enableGFM = gl.utils.convertPermissionToBoolean(el.dataset.supportsAutocomplete); const enableGFM = convertPermissionToBoolean(el.dataset.supportsAutocomplete);
gfm.setup($(el), { gfm.setup($(el), {
emojis: true, emojis: true,
members: enableGFM, members: enableGFM,
...@@ -385,7 +386,7 @@ import initGroupAnalytics from './init_group_analytics'; ...@@ -385,7 +386,7 @@ import initGroupAnalytics from './init_group_analytics';
if ($('.project-show-activity').length) new gl.Activities(); if ($('.project-show-activity').length) new gl.Activities();
$('#tree-slider').waitForImages(function() { $('#tree-slider').waitForImages(function() {
gl.utils.ajaxGet(document.querySelector('.js-tree-content').dataset.logsPath); ajaxGet(document.querySelector('.js-tree-content').dataset.logsPath);
}); });
initGeoInfoModal(); initGeoInfoModal();
...@@ -475,7 +476,7 @@ import initGroupAnalytics from './init_group_analytics'; ...@@ -475,7 +476,7 @@ import initGroupAnalytics from './init_group_analytics';
new UserCallout({ setCalloutPerProject: true }); new UserCallout({ setCalloutPerProject: true });
$('#tree-slider').waitForImages(function() { $('#tree-slider').waitForImages(function() {
gl.utils.ajaxGet(document.querySelector('.js-tree-content').dataset.logsPath); ajaxGet(document.querySelector('.js-tree-content').dataset.logsPath);
}); });
break; break;
case 'projects:find_file:show': case 'projects:find_file:show':
......
...@@ -6,7 +6,7 @@ import environmentTable from './environments_table.vue'; ...@@ -6,7 +6,7 @@ import environmentTable from './environments_table.vue';
import EnvironmentsStore from '../stores/environments_store'; import EnvironmentsStore from '../stores/environments_store';
import loadingIcon from '../../vue_shared/components/loading_icon.vue'; import loadingIcon from '../../vue_shared/components/loading_icon.vue';
import tablePagination from '../../vue_shared/components/table_pagination.vue'; import tablePagination from '../../vue_shared/components/table_pagination.vue';
import '../../lib/utils/common_utils'; import { convertPermissionToBoolean, getParameterByName, setParamInURL } from '../../lib/utils/common_utils';
import eventHub from '../event_hub'; import eventHub from '../event_hub';
import Poll from '../../lib/utils/poll'; import Poll from '../../lib/utils/poll';
import environmentsMixin from '../mixins/environments_mixin'; import environmentsMixin from '../mixins/environments_mixin';
...@@ -52,19 +52,19 @@ export default { ...@@ -52,19 +52,19 @@ export default {
computed: { computed: {
scope() { scope() {
return gl.utils.getParameterByName('scope'); return getParameterByName('scope');
}, },
canReadEnvironmentParsed() { canReadEnvironmentParsed() {
return gl.utils.convertPermissionToBoolean(this.canReadEnvironment); return convertPermissionToBoolean(this.canReadEnvironment);
}, },
canCreateDeploymentParsed() { canCreateDeploymentParsed() {
return gl.utils.convertPermissionToBoolean(this.canCreateDeployment); return convertPermissionToBoolean(this.canCreateDeployment);
}, },
canCreateEnvironmentParsed() { canCreateEnvironmentParsed() {
return gl.utils.convertPermissionToBoolean(this.canCreateEnvironment); return convertPermissionToBoolean(this.canCreateEnvironment);
}, },
/** /**
...@@ -83,8 +83,8 @@ export default { ...@@ -83,8 +83,8 @@ export default {
* Toggles loading property. * Toggles loading property.
*/ */
created() { created() {
const scope = gl.utils.getParameterByName('scope') || this.visibility; const scope = getParameterByName('scope') || this.visibility;
const page = gl.utils.getParameterByName('page') || this.pageNumber; const page = getParameterByName('page') || this.pageNumber;
this.service = new EnvironmentsService(this.endpoint); this.service = new EnvironmentsService(this.endpoint);
...@@ -154,15 +154,15 @@ export default { ...@@ -154,15 +154,15 @@ export default {
* @return {String} * @return {String}
*/ */
changePage(pageNumber) { changePage(pageNumber) {
const param = gl.utils.setParamInURL('page', pageNumber); const param = setParamInURL('page', pageNumber);
gl.utils.visitUrl(param); gl.utils.visitUrl(param);
return param; return param;
}, },
fetchEnvironments() { fetchEnvironments() {
const scope = gl.utils.getParameterByName('scope') || this.visibility; const scope = getParameterByName('scope') || this.visibility;
const page = gl.utils.getParameterByName('page') || this.pageNumber; const page = getParameterByName('page') || this.pageNumber;
this.isLoading = true; this.isLoading = true;
......
...@@ -9,7 +9,7 @@ import tablePagination from '../../vue_shared/components/table_pagination.vue'; ...@@ -9,7 +9,7 @@ import tablePagination from '../../vue_shared/components/table_pagination.vue';
import Poll from '../../lib/utils/poll'; import Poll from '../../lib/utils/poll';
import eventHub from '../event_hub'; import eventHub from '../event_hub';
import environmentsMixin from '../mixins/environments_mixin'; import environmentsMixin from '../mixins/environments_mixin';
import '../../lib/utils/common_utils'; import { convertPermissionToBoolean, getParameterByName, setParamInURL } from '../../lib/utils/common_utils';
export default { export default {
components: { components: {
...@@ -48,15 +48,15 @@ export default { ...@@ -48,15 +48,15 @@ export default {
computed: { computed: {
scope() { scope() {
return gl.utils.getParameterByName('scope'); return getParameterByName('scope');
}, },
canReadEnvironmentParsed() { canReadEnvironmentParsed() {
return gl.utils.convertPermissionToBoolean(this.canReadEnvironment); return convertPermissionToBoolean(this.canReadEnvironment);
}, },
canCreateDeploymentParsed() { canCreateDeploymentParsed() {
return gl.utils.convertPermissionToBoolean(this.canCreateDeployment); return convertPermissionToBoolean(this.canCreateDeployment);
}, },
/** /**
...@@ -83,8 +83,8 @@ export default { ...@@ -83,8 +83,8 @@ export default {
* Toggles loading property. * Toggles loading property.
*/ */
created() { created() {
const scope = gl.utils.getParameterByName('scope') || this.visibility; const scope = getParameterByName('scope') || this.visibility;
const page = gl.utils.getParameterByName('page') || this.pageNumber; const page = getParameterByName('page') || this.pageNumber;
this.service = new EnvironmentsService(this.endpoint); this.service = new EnvironmentsService(this.endpoint);
...@@ -137,15 +137,15 @@ export default { ...@@ -137,15 +137,15 @@ export default {
* @param {Number} pageNumber desired page to go to. * @param {Number} pageNumber desired page to go to.
*/ */
changePage(pageNumber) { changePage(pageNumber) {
const param = gl.utils.setParamInURL('page', pageNumber); const param = setParamInURL('page', pageNumber);
gl.utils.visitUrl(param); gl.utils.visitUrl(param);
return param; return param;
}, },
fetchEnvironments() { fetchEnvironments() {
const scope = gl.utils.getParameterByName('scope') || this.visibility; const scope = getParameterByName('scope') || this.visibility;
const page = gl.utils.getParameterByName('page') || this.pageNumber; const page = getParameterByName('page') || this.pageNumber;
this.isLoading = true; this.isLoading = true;
......
import '~/lib/utils/common_utils'; import { parseIntPagination, normalizeHeaders } from '~/lib/utils/common_utils';
/** /**
* Environments Store. * Environments Store.
* *
...@@ -97,8 +97,8 @@ export default class EnvironmentsStore { ...@@ -97,8 +97,8 @@ export default class EnvironmentsStore {
* @return {Object} * @return {Object}
*/ */
setPagination(pagination = {}) { setPagination(pagination = {}) {
const normalizedHeaders = gl.utils.normalizeHeaders(pagination); const normalizedHeaders = normalizeHeaders(pagination);
const paginationInformation = gl.utils.parseIntPagination(normalizedHeaders); const paginationInformation = parseIntPagination(normalizedHeaders);
this.state.paginationInformation = paginationInformation; this.state.paginationInformation = paginationInformation;
return paginationInformation; return paginationInformation;
......
<script> <script>
import tablePagination from '~/vue_shared/components/table_pagination.vue'; import tablePagination from '~/vue_shared/components/table_pagination.vue';
import eventHub from '../event_hub'; import eventHub from '../event_hub';
import { getParameterByName } from '../../lib/utils/common_utils';
export default { export default {
props: { props: {
...@@ -18,8 +19,8 @@ export default { ...@@ -18,8 +19,8 @@ export default {
}, },
methods: { methods: {
change(page) { change(page) {
const filterGroupsParam = gl.utils.getParameterByName('filter_groups'); const filterGroupsParam = getParameterByName('filter_groups');
const sortParam = gl.utils.getParameterByName('sort'); const sortParam = getParameterByName('sort');
eventHub.$emit('fetchPage', page, filterGroupsParam, sortParam); eventHub.$emit('fetchPage', page, filterGroupsParam, sortParam);
}, },
}, },
......
import FilterableList from '~/filterable_list'; import FilterableList from '~/filterable_list';
import eventHub from './event_hub'; import eventHub from './event_hub';
import { getParameterByName } from '../lib/utils/common_utils';
export default class GroupFilterableList extends FilterableList { export default class GroupFilterableList extends FilterableList {
constructor({ form, filter, holder, filterEndpoint, pagePath }) { constructor({ form, filter, holder, filterEndpoint, pagePath }) {
...@@ -54,7 +55,7 @@ export default class GroupFilterableList extends FilterableList { ...@@ -54,7 +55,7 @@ export default class GroupFilterableList extends FilterableList {
e.preventDefault(); e.preventDefault();
const queryData = {}; const queryData = {};
const sortParam = gl.utils.getParameterByName('sort', e.currentTarget.href); const sortParam = getParameterByName('sort', e.currentTarget.href);
if (sortParam) { if (sortParam) {
queryData.sort = sortParam; queryData.sort = sortParam;
......
...@@ -8,6 +8,7 @@ import GroupItem from './components/group_item.vue'; ...@@ -8,6 +8,7 @@ import GroupItem from './components/group_item.vue';
import GroupsStore from './stores/groups_store'; import GroupsStore from './stores/groups_store';
import GroupsService from './services/groups_service'; import GroupsService from './services/groups_service';
import eventHub from './event_hub'; import eventHub from './event_hub';
import { getParameterByName } from '../lib/utils/common_utils';
document.addEventListener('DOMContentLoaded', () => { document.addEventListener('DOMContentLoaded', () => {
const el = document.getElementById('dashboard-group-app'); const el = document.getElementById('dashboard-group-app');
...@@ -58,17 +59,17 @@ document.addEventListener('DOMContentLoaded', () => { ...@@ -58,17 +59,17 @@ document.addEventListener('DOMContentLoaded', () => {
this.isLoading = true; this.isLoading = true;
} }
pageParam = gl.utils.getParameterByName('page'); pageParam = getParameterByName('page');
if (pageParam) { if (pageParam) {
page = pageParam; page = pageParam;
} }
filterGroupsParam = gl.utils.getParameterByName('filter_groups'); filterGroupsParam = getParameterByName('filter_groups');
if (filterGroupsParam) { if (filterGroupsParam) {
filterGroups = filterGroupsParam; filterGroups = filterGroupsParam;
} }
sortParam = gl.utils.getParameterByName('sort'); sortParam = getParameterByName('sort');
if (sortParam) { if (sortParam) {
sort = sortParam; sort = sortParam;
} }
......
import Vue from 'vue'; import Vue from 'vue';
import { parseIntPagination, normalizeHeaders } from '../../lib/utils/common_utils';
export default class GroupsStore { export default class GroupsStore {
constructor() { constructor() {
...@@ -30,8 +31,8 @@ export default class GroupsStore { ...@@ -30,8 +31,8 @@ export default class GroupsStore {
let paginationInfo; let paginationInfo;
if (Object.keys(pagination).length) { if (Object.keys(pagination).length) {
const normalizedHeaders = gl.utils.normalizeHeaders(pagination); const normalizedHeaders = normalizeHeaders(pagination);
paginationInfo = gl.utils.parseIntPagination(normalizedHeaders); paginationInfo = parseIntPagination(normalizedHeaders);
} else { } else {
paginationInfo = pagination; paginationInfo = pagination;
} }
......
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
prefer-rest-params, prefer-spread, no-unused-vars, prefer-template, prefer-rest-params, prefer-spread, no-unused-vars, prefer-template,
promise/catch-or-return */ promise/catch-or-return */
import Api from './api'; import Api from './api';
import { normalizeCRLFHeaders } from './lib/utils/common_utils';
var slice = [].slice; var slice = [].slice;
...@@ -30,7 +31,7 @@ window.GroupsSelect = (function() { ...@@ -30,7 +31,7 @@ window.GroupsSelect = (function() {
$.ajax(params).then((data, status, xhr) => { $.ajax(params).then((data, status, xhr) => {
const results = data || []; const results = data || [];
const headers = gl.utils.normalizeCRLFHeaders(xhr.getAllResponseHeaders()); const headers = normalizeCRLFHeaders(xhr.getAllResponseHeaders());
const currentPage = parseInt(headers['X-PAGE'], 10) || 0; const currentPage = parseInt(headers['X-PAGE'], 10) || 0;
const totalPages = parseInt(headers['X-TOTAL-PAGES'], 10) || 0; const totalPages = parseInt(headers['X-TOTAL-PAGES'], 10) || 0;
const more = currentPage < totalPages; const more = currentPage < totalPages;
......
import Vue from 'vue'; import Vue from 'vue';
import RelatedIssuesRoot from './related_issues/components/related_issues_root.vue'; import RelatedIssuesRoot from './related_issues/components/related_issues_root.vue';
import { convertPermissionToBoolean } from '../lib/utils/common_utils';
document.addEventListener('DOMContentLoaded', () => { document.addEventListener('DOMContentLoaded', () => {
const relatedIssuesRootElement = document.querySelector('.js-related-issues-root'); const relatedIssuesRootElement = document.querySelector('.js-related-issues-root');
...@@ -13,7 +14,7 @@ document.addEventListener('DOMContentLoaded', () => { ...@@ -13,7 +14,7 @@ document.addEventListener('DOMContentLoaded', () => {
render: createElement => createElement('related-issues-root', { render: createElement => createElement('related-issues-root', {
props: { props: {
endpoint: relatedIssuesRootElement.dataset.endpoint, endpoint: relatedIssuesRootElement.dataset.endpoint,
canAddRelatedIssues: gl.utils.convertPermissionToBoolean( canAddRelatedIssues: convertPermissionToBoolean(
relatedIssuesRootElement.dataset.canAddRelatedIssues, relatedIssuesRootElement.dataset.canAddRelatedIssues,
), ),
helpPath: relatedIssuesRootElement.dataset.helpPath, helpPath: relatedIssuesRootElement.dataset.helpPath,
......
import httpStatusCodes from './http_status'; import httpStatusCodes from './http_status';
import { normalizeHeaders } from './common_utils';
/** /**
* Polling utility for handling realtime updates. * Polling utility for handling realtime updates.
...@@ -57,7 +58,7 @@ export default class Poll { ...@@ -57,7 +58,7 @@ export default class Poll {
} }
checkConditions(response) { checkConditions(response) {
const headers = gl.utils.normalizeHeaders(response.headers); const headers = normalizeHeaders(response.headers);
const pollInterval = parseInt(headers[this.intervalHeader], 10); const pollInterval = parseInt(headers[this.intervalHeader], 10);
if (pollInterval > 0 && response.status === httpStatusCodes.OK && this.canPoll) { if (pollInterval > 0 && response.status === httpStatusCodes.OK && this.canPoll) {
......
...@@ -40,7 +40,7 @@ import './commit/image_file'; ...@@ -40,7 +40,7 @@ import './commit/image_file';
// lib/utils // lib/utils
import './lib/utils/bootstrap_linked_tabs'; import './lib/utils/bootstrap_linked_tabs';
import './lib/utils/common_utils'; import { handleLocationHash } from './lib/utils/common_utils';
import './lib/utils/datetime_utility'; import './lib/utils/datetime_utility';
import './lib/utils/pretty_time'; import './lib/utils/pretty_time';
import './lib/utils/text_utility'; import './lib/utils/text_utility';
...@@ -169,10 +169,10 @@ document.addEventListener('beforeunload', function () { ...@@ -169,10 +169,10 @@ document.addEventListener('beforeunload', function () {
$('[data-toggle="popover"]').popover('destroy'); $('[data-toggle="popover"]').popover('destroy');
}); });
window.addEventListener('hashchange', gl.utils.handleLocationHash); window.addEventListener('hashchange', handleLocationHash);
window.addEventListener('load', function onLoad() { window.addEventListener('load', function onLoad() {
window.removeEventListener('load', onLoad, false); window.removeEventListener('load', onLoad, false);
gl.utils.handleLocationHash(); handleLocationHash();
}, false); }, false);
gl.lazyLoader = new LazyLoader({ gl.lazyLoader = new LazyLoader({
...@@ -198,7 +198,7 @@ $(function () { ...@@ -198,7 +198,7 @@ $(function () {
$body.on('click', 'a[href^="#"]', function() { $body.on('click', 'a[href^="#"]', function() {
var href = this.getAttribute('href'); var href = this.getAttribute('href');
if (href.substr(1) === gl.utils.getLocationHash()) { if (href.substr(1) === gl.utils.getLocationHash()) {
setTimeout(gl.utils.handleLocationHash, 1); setTimeout(handleLocationHash, 1);
} }
}); });
......
...@@ -7,6 +7,11 @@ import './flash'; ...@@ -7,6 +7,11 @@ import './flash';
import BlobForkSuggestion from './blob/blob_fork_suggestion'; import BlobForkSuggestion from './blob/blob_fork_suggestion';
import initChangesDropdown from './init_changes_dropdown'; import initChangesDropdown from './init_changes_dropdown';
import bp from './breakpoints'; import bp from './breakpoints';
import {
parseUrlPathname,
handleLocationHash,
isMetaClick,
} from './lib/utils/common_utils';
/* eslint-disable max-len */ /* eslint-disable max-len */
// MergeRequestTabs // MergeRequestTabs
...@@ -114,7 +119,7 @@ import bp from './breakpoints'; ...@@ -114,7 +119,7 @@ import bp from './breakpoints';
} }
clickTab(e) { clickTab(e) {
if (e.currentTarget && gl.utils.isMetaClick(e)) { if (e.currentTarget && isMetaClick(e)) {
const targetLink = e.currentTarget.getAttribute('href'); const targetLink = e.currentTarget.getAttribute('href');
e.stopImmediatePropagation(); e.stopImmediatePropagation();
e.preventDefault(); e.preventDefault();
...@@ -260,7 +265,7 @@ import bp from './breakpoints'; ...@@ -260,7 +265,7 @@ import bp from './breakpoints';
// We extract pathname for the current Changes tab anchor href // We extract pathname for the current Changes tab anchor href
// some pages like MergeRequestsController#new has query parameters on that anchor // some pages like MergeRequestsController#new has query parameters on that anchor
const urlPathname = gl.utils.parseUrlPathname(source); const urlPathname = parseUrlPathname(source);
this.ajaxGet({ this.ajaxGet({
url: `${urlPathname}.json${location.search}`, url: `${urlPathname}.json${location.search}`,
...@@ -309,7 +314,7 @@ import bp from './breakpoints'; ...@@ -309,7 +314,7 @@ import bp from './breakpoints';
forceShow: true, forceShow: true,
}); });
anchor[0].scrollIntoView(); anchor[0].scrollIntoView();
window.gl.utils.handleLocationHash(); handleLocationHash();
// We have multiple elements on the page with `#note_xxx` // We have multiple elements on the page with `#note_xxx`
// (discussion and diff tabs) and `:target` only applies to the first // (discussion and diff tabs) and `:target` only applies to the first
anchor.addClass('target'); anchor.addClass('target');
......
/* global Flash */ /* global Flash */
import AUTH_METHOD from './constants'; import AUTH_METHOD from './constants';
import { backOff } from '../lib/utils/common_utils';
export default class MirrorPull { export default class MirrorPull {
constructor(formSelector) { constructor(formSelector) {
...@@ -65,7 +66,7 @@ export default class MirrorPull { ...@@ -65,7 +66,7 @@ export default class MirrorPull {
$btnLoadSpinner.removeClass('hidden'); $btnLoadSpinner.removeClass('hidden');
// Make backOff polling to get data // Make backOff polling to get data
gl.utils.backOff((next, stop) => { backOff((next, stop) => {
$.getJSON(`${projectMirrorSSHEndpoint}?ssh_url=${repositoryUrl}`) $.getJSON(`${projectMirrorSSHEndpoint}?ssh_url=${repositoryUrl}`)
.done((res, statusText, header) => { .done((res, statusText, header) => {
if (header.status === 204) { if (header.status === 204) {
......
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
import EmptyState from './empty_state.vue'; import EmptyState from './empty_state.vue';
import MonitoringStore from '../stores/monitoring_store'; import MonitoringStore from '../stores/monitoring_store';
import eventHub from '../event_hub'; import eventHub from '../event_hub';
import { convertPermissionToBoolean } from '../../lib/utils/common_utils';
export default { export default {
...@@ -17,7 +18,7 @@ ...@@ -17,7 +18,7 @@
return { return {
store, store,
state: 'gettingStarted', state: 'gettingStarted',
hasMetrics: gl.utils.convertPermissionToBoolean(metricsData.hasMetrics), hasMetrics: convertPermissionToBoolean(metricsData.hasMetrics),
documentationPath: metricsData.documentationPath, documentationPath: metricsData.documentationPath,
settingsPath: metricsData.settingsPath, settingsPath: metricsData.settingsPath,
metricsEndpoint: metricsData.additionalMetrics, metricsEndpoint: metricsData.additionalMetrics,
......
import Vue from 'vue'; import Vue from 'vue';
import VueResource from 'vue-resource'; import VueResource from 'vue-resource';
import statusCodes from '../../lib/utils/http_status'; import statusCodes from '../../lib/utils/http_status';
import { backOff } from '../../lib/utils/common_utils';
Vue.use(VueResource); Vue.use(VueResource);
...@@ -8,7 +9,7 @@ const MAX_REQUESTS = 3; ...@@ -8,7 +9,7 @@ const MAX_REQUESTS = 3;
function backOffRequest(makeRequestCallback) { function backOffRequest(makeRequestCallback) {
let requestCounter = 0; let requestCounter = 0;
return gl.utils.backOff((next, stop) => { return backOff((next, stop) => {
makeRequestCallback().then((resp) => { makeRequestCallback().then((resp) => {
if (resp.status === statusCodes.NO_CONTENT) { if (resp.status === statusCodes.NO_CONTENT) {
requestCounter += 1; requestCounter += 1;
......
...@@ -23,6 +23,7 @@ import loadAwardsHandler from './awards_handler'; ...@@ -23,6 +23,7 @@ import loadAwardsHandler from './awards_handler';
import './autosave'; import './autosave';
import './dropzone_input'; import './dropzone_input';
import TaskList from './task_list'; import TaskList from './task_list';
import { ajaxPost, isInViewport, getPagePath, scrollToElement, isMetaKey } from './lib/utils/common_utils';
window.autosize = autosize; window.autosize = autosize;
window.Dropzone = Dropzone; window.Dropzone = Dropzone;
...@@ -81,7 +82,7 @@ export default class Notes { ...@@ -81,7 +82,7 @@ export default class Notes {
this.setViewType(view); this.setViewType(view);
// We are in the Merge Requests page so we need another edit form for Changes tab // We are in the Merge Requests page so we need another edit form for Changes tab
if (gl.utils.getPagePath(1) === 'merge_requests') { if (getPagePath(1) === 'merge_requests') {
$('.note-edit-form').clone() $('.note-edit-form').clone()
.addClass('mr-note-edit-form').insertAfter('.note-edit-form'); .addClass('mr-note-edit-form').insertAfter('.note-edit-form');
} }
...@@ -175,7 +176,7 @@ export default class Notes { ...@@ -175,7 +176,7 @@ export default class Notes {
keydownNoteText(e) { keydownNoteText(e) {
var $textarea, discussionNoteForm, editNote, myLastNote, myLastNoteEditBtn, newText, originalText; var $textarea, discussionNoteForm, editNote, myLastNote, myLastNoteEditBtn, newText, originalText;
if (gl.utils.isMetaKey(e)) { if (isMetaKey(e)) {
return; return;
} }
...@@ -644,10 +645,10 @@ export default class Notes { ...@@ -644,10 +645,10 @@ export default class Notes {
} }
else { else {
var $buttons = $el.find('.note-form-actions'); var $buttons = $el.find('.note-form-actions');
var isWidgetVisible = gl.utils.isInViewport($el.get(0)); var isWidgetVisible = isInViewport($el.get(0));
if (!isWidgetVisible) { if (!isWidgetVisible) {
gl.utils.scrollToElement($el); scrollToElement($el);
} }
$el.find('.js-finish-edit-warning').show(); $el.find('.js-finish-edit-warning').show();
...@@ -1188,7 +1189,7 @@ export default class Notes { ...@@ -1188,7 +1189,7 @@ export default class Notes {
} }
static checkMergeRequestStatus() { static checkMergeRequestStatus() {
if (gl.utils.getPagePath(1) === 'merge_requests') { if (getPagePath(1) === 'merge_requests') {
gl.mrWidget.checkStatus(); gl.mrWidget.checkStatus();
} }
} }
...@@ -1326,7 +1327,7 @@ export default class Notes { ...@@ -1326,7 +1327,7 @@ export default class Notes {
* 2) Identify comment type; a) Main thread b) Discussion thread c) Discussion resolve * 2) Identify comment type; a) Main thread b) Discussion thread c) Discussion resolve
* 3) Build temporary placeholder element (using `createPlaceholderNote`) * 3) Build temporary placeholder element (using `createPlaceholderNote`)
* 4) Show placeholder note on UI * 4) Show placeholder note on UI
* 5) Perform network request to submit the note using `gl.utils.ajaxPost` * 5) Perform network request to submit the note using `ajaxPost`
* a) If request is successfully completed * a) If request is successfully completed
* 1. Remove placeholder element * 1. Remove placeholder element
* 2. Show submitted Note element * 2. Show submitted Note element
...@@ -1408,7 +1409,7 @@ export default class Notes { ...@@ -1408,7 +1409,7 @@ export default class Notes {
/* eslint-disable promise/catch-or-return */ /* eslint-disable promise/catch-or-return */
// Make request to submit comment on server // Make request to submit comment on server
gl.utils.ajaxPost(formAction, formData) ajaxPost(formAction, formData)
.then((note) => { .then((note) => {
// Submission successful! remove placeholder // Submission successful! remove placeholder
$notesContainer.find(`#${noteUniqueId}`).remove(); $notesContainer.find(`#${noteUniqueId}`).remove();
...@@ -1481,7 +1482,7 @@ export default class Notes { ...@@ -1481,7 +1482,7 @@ export default class Notes {
* *
* 1) Get Form metadata * 1) Get Form metadata
* 2) Update note element with new content * 2) Update note element with new content
* 3) Perform network request to submit the updated note using `gl.utils.ajaxPost` * 3) Perform network request to submit the updated note using `ajaxPost`
* a) If request is successfully completed * a) If request is successfully completed
* 1. Show submitted Note element * 1. Show submitted Note element
* b) If request failed * b) If request failed
...@@ -1510,7 +1511,7 @@ export default class Notes { ...@@ -1510,7 +1511,7 @@ export default class Notes {
/* eslint-disable promise/catch-or-return */ /* eslint-disable promise/catch-or-return */
// Make request to update comment on server // Make request to update comment on server
gl.utils.ajaxPost(formAction, formData) ajaxPost(formAction, formData)
.then((note) => { .then((note) => {
// Submission successful! render final note element // Submission successful! render final note element
this.updateNote(note, $editingNote); this.updateNote(note, $editingNote);
......
...@@ -7,6 +7,7 @@ import * as constants from '../constants'; ...@@ -7,6 +7,7 @@ import * as constants from '../constants';
import service from '../services/issue_notes_service'; import service from '../services/issue_notes_service';
import loadAwardsHandler from '../../awards_handler'; import loadAwardsHandler from '../../awards_handler';
import sidebarTimeTrackingEventHub from '../../sidebar/event_hub'; import sidebarTimeTrackingEventHub from '../../sidebar/event_hub';
import { isInViewport, scrollToElement } from '../../lib/utils/common_utils';
let eTagPoll; let eTagPoll;
...@@ -211,7 +212,7 @@ export const toggleAwardRequest = ({ commit, getters, dispatch }, data) => { ...@@ -211,7 +212,7 @@ export const toggleAwardRequest = ({ commit, getters, dispatch }, data) => {
}; };
export const scrollToNoteIfNeeded = (context, el) => { export const scrollToNoteIfNeeded = (context, el) => {
if (!gl.utils.isInViewport(el[0])) { if (!isInViewport(el[0])) {
gl.utils.scrollToElement(el); scrollToElement(el);
} }
}; };
import '~/lib/utils/common_utils'; import { getParameterByName } from '~/lib/utils/common_utils';
import '~/lib/utils/url_utility'; import '~/lib/utils/url_utility';
(() => { (() => {
...@@ -9,7 +9,7 @@ import '~/lib/utils/url_utility'; ...@@ -9,7 +9,7 @@ import '~/lib/utils/url_utility';
init(limit = 0, preload = false, disable = false, prepareData = $.noop, callback = $.noop) { init(limit = 0, preload = false, disable = false, prepareData = $.noop, callback = $.noop) {
this.url = $('.content_list').data('href') || gl.utils.removeParams(['limit', 'offset']); this.url = $('.content_list').data('href') || gl.utils.removeParams(['limit', 'offset']);
this.limit = limit; this.limit = limit;
this.offset = parseInt(gl.utils.getParameterByName('offset'), 10) || this.limit; this.offset = parseInt(getParameterByName('offset'), 10) || this.limit;
this.disable = disable; this.disable = disable;
this.prepareData = prepareData; this.prepareData = prepareData;
this.callback = callback; this.callback = callback;
......
import { convertPermissionToBoolean } from '../lib/utils/common_utils';
function insertRow($row) { function insertRow($row) {
const $rowClone = $row.clone(); const $rowClone = $row.clone();
$rowClone.removeAttr('data-is-persisted'); $rowClone.removeAttr('data-is-persisted');
...@@ -6,7 +8,7 @@ function insertRow($row) { ...@@ -6,7 +8,7 @@ function insertRow($row) {
} }
function removeRow($row) { function removeRow($row) {
const isPersisted = gl.utils.convertPermissionToBoolean($row.attr('data-is-persisted')); const isPersisted = convertPermissionToBoolean($row.attr('data-is-persisted'));
if (isPersisted) { if (isPersisted) {
$row.hide(); $row.hide();
......
import LinkedTabs from './lib/utils/bootstrap_linked_tabs'; import LinkedTabs from './lib/utils/bootstrap_linked_tabs';
import { setCiStatusFavicon } from './lib/utils/common_utils';
export default class Pipelines { export default class Pipelines {
constructor(options = {}) { constructor(options = {}) {
...@@ -8,7 +9,7 @@ export default class Pipelines { ...@@ -8,7 +9,7 @@ export default class Pipelines {
} }
if (options.pipelineStatusUrl) { if (options.pipelineStatusUrl) {
gl.utils.setCiStatusFavicon(options.pipelineStatusUrl); setCiStatusFavicon(options.pipelineStatusUrl);
} }
} }
} }
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
import tablePagination from '../../vue_shared/components/table_pagination.vue'; import tablePagination from '../../vue_shared/components/table_pagination.vue';
import navigationTabs from './navigation_tabs.vue'; import navigationTabs from './navigation_tabs.vue';
import navigationControls from './nav_controls.vue'; import navigationControls from './nav_controls.vue';
import { convertPermissionToBoolean, getParameterByName, setParamInURL } from '../../lib/utils/common_utils';
export default { export default {
props: { props: {
...@@ -44,10 +45,10 @@ ...@@ -44,10 +45,10 @@
}, },
computed: { computed: {
canCreatePipelineParsed() { canCreatePipelineParsed() {
return gl.utils.convertPermissionToBoolean(this.canCreatePipeline); return convertPermissionToBoolean(this.canCreatePipeline);
}, },
scope() { scope() {
const scope = gl.utils.getParameterByName('scope'); const scope = getParameterByName('scope');
return scope === null ? 'all' : scope; return scope === null ? 'all' : scope;
}, },
...@@ -105,10 +106,10 @@ ...@@ -105,10 +106,10 @@
}; };
}, },
pageParameter() { pageParameter() {
return gl.utils.getParameterByName('page') || this.pagenum; return getParameterByName('page') || this.pagenum;
}, },
scopeParameter() { scopeParameter() {
return gl.utils.getParameterByName('scope') || this.apiScope; return getParameterByName('scope') || this.apiScope;
}, },
}, },
created() { created() {
...@@ -122,7 +123,7 @@ ...@@ -122,7 +123,7 @@
* @param {Number} pageNumber desired page to go to. * @param {Number} pageNumber desired page to go to.
*/ */
change(pageNumber) { change(pageNumber) {
const param = gl.utils.setParamInURL('page', pageNumber); const param = setParamInURL('page', pageNumber);
gl.utils.visitUrl(param); gl.utils.visitUrl(param);
return param; return param;
......
import { parseIntPagination, normalizeHeaders } from '../../lib/utils/common_utils';
export default class PipelinesStore { export default class PipelinesStore {
constructor() { constructor() {
this.state = {}; this.state = {};
...@@ -19,8 +21,8 @@ export default class PipelinesStore { ...@@ -19,8 +21,8 @@ export default class PipelinesStore {
let paginationInfo; let paginationInfo;
if (Object.keys(pagination).length) { if (Object.keys(pagination).length) {
const normalizedHeaders = gl.utils.normalizeHeaders(pagination); const normalizedHeaders = normalizeHeaders(pagination);
paginationInfo = gl.utils.parseIntPagination(normalizedHeaders); paginationInfo = parseIntPagination(normalizedHeaders);
} else { } else {
paginationInfo = pagination; paginationInfo = pagination;
} }
......
/* eslint-disable comma-dangle, no-unused-vars, class-methods-use-this, quotes, consistent-return, func-names, prefer-arrow-callback, space-before-function-paren, max-len */ /* eslint-disable comma-dangle, no-unused-vars, class-methods-use-this, quotes, consistent-return, func-names, prefer-arrow-callback, space-before-function-paren, max-len */
/* global Flash */ /* global Flash */
import { getPagePath } from '../lib/utils/common_utils';
((global) => { ((global) => {
class Profile { class Profile {
...@@ -93,7 +94,7 @@ ...@@ -93,7 +94,7 @@
return $title.val(comment[1]).change(); return $title.val(comment[1]).change();
} }
}); });
if (global.utils.getPagePath() === 'profiles') { if (getPagePath() === 'profiles') {
return new Profile(); return new Profile();
} }
}); });
......
import Vue from 'vue'; import Vue from 'vue';
import serviceDeskRoot from './components/service_desk_root.vue'; import serviceDeskRoot from './components/service_desk_root.vue';
import { convertPermissionToBoolean } from '../../lib/utils/common_utils';
document.addEventListener('DOMContentLoaded', () => { document.addEventListener('DOMContentLoaded', () => {
const serviceDeskRootElement = document.querySelector('.js-service-desk-setting-root'); const serviceDeskRootElement = document.querySelector('.js-service-desk-setting-root');
...@@ -10,7 +11,7 @@ document.addEventListener('DOMContentLoaded', () => { ...@@ -10,7 +11,7 @@ document.addEventListener('DOMContentLoaded', () => {
data() { data() {
const dataset = serviceDeskRootElement.dataset; const dataset = serviceDeskRootElement.dataset;
return { return {
initialIsEnabled: gl.utils.convertPermissionToBoolean( initialIsEnabled: convertPermissionToBoolean(
dataset.enabled, dataset.enabled,
), ),
endpoint: dataset.endpoint, endpoint: dataset.endpoint,
......
import PANEL_STATE from './constants'; import PANEL_STATE from './constants';
import { backOff } from '../lib/utils/common_utils';
export default class PrometheusMetrics { export default class PrometheusMetrics {
constructor(wrapperSelector) { constructor(wrapperSelector) {
...@@ -79,7 +80,7 @@ export default class PrometheusMetrics { ...@@ -79,7 +80,7 @@ export default class PrometheusMetrics {
loadActiveMetrics() { loadActiveMetrics() {
this.showMonitoringMetricsPanelState(PANEL_STATE.LOADING); this.showMonitoringMetricsPanelState(PANEL_STATE.LOADING);
gl.utils.backOff((next, stop) => { backOff((next, stop) => {
$.getJSON(this.activeMetricsEndpoint) $.getJSON(this.activeMetricsEndpoint)
.done((res) => { .done((res) => {
if (res && res.success) { if (res && res.success) {
......
/* eslint-disable comma-dangle, no-return-assign, one-var, no-var, no-underscore-dangle, one-var-declaration-per-line, no-unused-vars, no-cond-assign, consistent-return, object-shorthand, prefer-arrow-callback, func-names, space-before-function-paren, prefer-template, quotes, class-methods-use-this, no-unused-expressions, no-sequences, wrap-iife, no-lonely-if, no-else-return, no-param-reassign, vars-on-top, max-len */ /* eslint-disable comma-dangle, no-return-assign, one-var, no-var, no-underscore-dangle, one-var-declaration-per-line, no-unused-vars, no-cond-assign, consistent-return, object-shorthand, prefer-arrow-callback, func-names, space-before-function-paren, prefer-template, quotes, class-methods-use-this, no-unused-expressions, no-sequences, wrap-iife, no-lonely-if, no-else-return, no-param-reassign, vars-on-top, max-len */
import { isInGroupsPage, isInProjectPage, getGroupSlug, getProjectSlug } from './lib/utils/common_utils';
((global) => { ((global) => {
const KEYCODE = { const KEYCODE = {
...@@ -146,14 +147,14 @@ ...@@ -146,14 +147,14 @@
} }
getCategoryContents() { getCategoryContents() {
var dashboardOptions, groupOptions, issuesPath, items, mrPath, name, options, projectOptions, userId, userName, utils; var dashboardOptions, groupOptions, issuesPath, items, mrPath, name, options, projectOptions, userId, userName;
userId = gon.current_user_id; userId = gon.current_user_id;
userName = gon.current_username; userName = gon.current_username;
utils = gl.utils, projectOptions = gl.projectOptions, groupOptions = gl.groupOptions, dashboardOptions = gl.dashboardOptions; projectOptions = gl.projectOptions, groupOptions = gl.groupOptions, dashboardOptions = gl.dashboardOptions;
if (utils.isInGroupsPage() && groupOptions) { if (isInGroupsPage() && groupOptions) {
options = groupOptions[utils.getGroupSlug()]; options = groupOptions[getGroupSlug()];
} else if (utils.isInProjectPage() && projectOptions) { } else if (isInProjectPage() && projectOptions) {
options = projectOptions[utils.getProjectSlug()]; options = projectOptions[getProjectSlug()];
} else if (dashboardOptions) { } else if (dashboardOptions) {
options = dashboardOptions; options = dashboardOptions;
} }
......
/* eslint-disable class-methods-use-this, no-unneeded-ternary, quote-props */ /* eslint-disable class-methods-use-this, no-unneeded-ternary, quote-props */
import UsersSelect from './users_select'; import UsersSelect from './users_select';
import { isMetaClick } from './lib/utils/common_utils';
export default class Todos { export default class Todos {
constructor() { constructor() {
...@@ -137,22 +138,17 @@ export default class Todos { ...@@ -137,22 +138,17 @@ export default class Todos {
goToTodoUrl(e) { goToTodoUrl(e) {
const todoLink = this.dataset.url; const todoLink = this.dataset.url;
if (!todoLink) { if (!todoLink || e.target.tagName === 'A' || e.target.tagName === 'IMG') {
return; return;
} }
if (gl.utils.isMetaClick(e)) {
const windowTarget = '_blank';
const selected = e.target;
e.stopPropagation(); e.stopPropagation();
e.preventDefault(); e.preventDefault();
if (selected.tagName === 'IMG') { if (isMetaClick(e)) {
const avatarUrl = selected.parentElement.getAttribute('href'); const windowTarget = '_blank';
window.open(avatarUrl, windowTarget);
} else {
window.open(todoLink, windowTarget); window.open(todoLink, windowTarget);
}
} else { } else {
gl.utils.visitUrl(todoLink); gl.utils.visitUrl(todoLink);
} }
......
import statusCodes from '../../lib/utils/http_status'; import statusCodes from '../../lib/utils/http_status';
import { bytesToMiB } from '../../lib/utils/number_utils'; import { bytesToMiB } from '../../lib/utils/number_utils';
import { backOff } from '../../lib/utils/common_utils';
import MemoryGraph from '../../vue_shared/components/memory_graph'; import MemoryGraph from '../../vue_shared/components/memory_graph';
import MRWidgetService from '../services/mr_widget_service'; import MRWidgetService from '../services/mr_widget_service';
...@@ -84,7 +84,7 @@ export default { ...@@ -84,7 +84,7 @@ export default {
} }
}, },
loadMetrics() { loadMetrics() {
gl.utils.backOff((next, stop) => { backOff((next, stop) => {
MRWidgetService.fetchMetrics(this.metricsUrl) MRWidgetService.fetchMetrics(this.metricsUrl)
.then((res) => { .then((res) => {
if (res.status === statusCodes.NO_CONTENT) { if (res.status === statusCodes.NO_CONTENT) {
......
...@@ -31,6 +31,7 @@ import { ...@@ -31,6 +31,7 @@ import {
SquashBeforeMerge, SquashBeforeMerge,
notify, notify,
} from './dependencies'; } from './dependencies';
import { setFavicon } from '../lib/utils/common_utils';
export default { export default {
el: '#js-vue-mr-widget', el: '#js-vue-mr-widget',
...@@ -88,7 +89,7 @@ export default { ...@@ -88,7 +89,7 @@ export default {
.then((res) => { .then((res) => {
this.handleNotification(res); this.handleNotification(res);
this.mr.setData(res); this.mr.setData(res);
this.setFavicon(); this.setFaviconHelper();
if (cb) { if (cb) {
cb.call(null, res); cb.call(null, res);
...@@ -115,9 +116,9 @@ export default { ...@@ -115,9 +116,9 @@ export default {
immediateExecution: true, immediateExecution: true,
}); });
}, },
setFavicon() { setFaviconHelper() {
if (this.mr.ciStatusFaviconPath) { if (this.mr.ciStatusFaviconPath) {
gl.utils.setFavicon(this.mr.ciStatusFaviconPath); setFavicon(this.mr.ciStatusFaviconPath);
} }
}, },
fetchDeployments() { fetchDeployments() {
...@@ -191,7 +192,7 @@ export default { ...@@ -191,7 +192,7 @@ export default {
}); });
}, },
handleMounted() { handleMounted() {
this.setFavicon(); this.setFaviconHelper();
this.initDeploymentsPolling(); this.initDeploymentsPolling();
}, },
}, },
......
---
title: Exports common_utils utility functions as modules
merge_request:
author:
type: other
...@@ -14,6 +14,10 @@ describe('Environments Folder View', () => { ...@@ -14,6 +14,10 @@ describe('Environments Folder View', () => {
window.history.pushState({}, null, 'environments/folders/build'); window.history.pushState({}, null, 'environments/folders/build');
}); });
afterEach(() => {
window.history.pushState({}, null, '/');
});
let component; let component;
describe('successfull request', () => { describe('successfull request', () => {
......
...@@ -78,8 +78,9 @@ import 'vendor/jquery.scrollTo'; ...@@ -78,8 +78,9 @@ import 'vendor/jquery.scrollTo';
}); });
describe('meta click', () => { describe('meta click', () => {
let metakeyEvent;
beforeEach(function () { beforeEach(function () {
spyOn(gl.utils, 'isMetaClick').and.returnValue(true); metakeyEvent = $.Event('click', { keyCode: 91, ctrlKey: true });
}); });
it('opens page when commits link is clicked', function () { it('opens page when commits link is clicked', function () {
...@@ -89,7 +90,7 @@ import 'vendor/jquery.scrollTo'; ...@@ -89,7 +90,7 @@ import 'vendor/jquery.scrollTo';
}); });
this.class.bindEvents(); this.class.bindEvents();
document.querySelector('.merge-request-tabs .commits-tab a').click(); $('.merge-request-tabs .commits-tab a').trigger(metakeyEvent);
}); });
it('opens page when commits badge is clicked', function () { it('opens page when commits badge is clicked', function () {
...@@ -99,7 +100,7 @@ import 'vendor/jquery.scrollTo'; ...@@ -99,7 +100,7 @@ import 'vendor/jquery.scrollTo';
}); });
this.class.bindEvents(); this.class.bindEvents();
document.querySelector('.merge-request-tabs .commits-tab a .badge').click(); $('.merge-request-tabs .commits-tab a .badge').trigger(metakeyEvent);
}); });
}); });
......
...@@ -26,37 +26,30 @@ describe('Todos', () => { ...@@ -26,37 +26,30 @@ describe('Todos', () => {
describe('meta click', () => { describe('meta click', () => {
let visitUrlSpy; let visitUrlSpy;
let windowOpenSpy;
let metakeyEvent;
beforeEach(() => { beforeEach(() => {
spyOn(gl.utils, 'isMetaClick').and.returnValue(true); metakeyEvent = $.Event('click', { keyCode: 91, ctrlKey: true });
visitUrlSpy = spyOn(gl.utils, 'visitUrl').and.callFake(() => {}); visitUrlSpy = spyOn(gl.utils, 'visitUrl').and.callFake(() => {});
windowOpenSpy = spyOn(window, 'open').and.callFake(() => {});
}); });
it('opens the todo url in another tab', (done) => { it('opens the todo url in another tab', () => {
const todoLink = todoItem.dataset.url; const todoLink = todoItem.dataset.url;
spyOn(window, 'open').and.callFake((url, target) => { $('.todos-list .todo').trigger(metakeyEvent);
expect(todoLink).toEqual(url);
expect(target).toEqual('_blank');
done();
});
todoItem.click();
expect(visitUrlSpy).not.toHaveBeenCalled(); expect(visitUrlSpy).not.toHaveBeenCalled();
expect(windowOpenSpy).toHaveBeenCalledWith(todoLink, '_blank');
}); });
it('opens the avatar\'s url in another tab when the avatar is clicked', (done) => { it('run native funcionality when avatar is clicked', () => {
const avatarImage = todoItem.querySelector('img'); $('.todos-list a').on('click', e => e.preventDefault());
const avatarUrl = avatarImage.parentElement.getAttribute('href'); $('.todos-list img').trigger(metakeyEvent);
spyOn(window, 'open').and.callFake((url, target) => {
expect(avatarUrl).toEqual(url);
expect(target).toEqual('_blank');
done();
});
avatarImage.click();
expect(visitUrlSpy).not.toHaveBeenCalled(); expect(visitUrlSpy).not.toHaveBeenCalled();
expect(windowOpenSpy).not.toHaveBeenCalled();
}); });
}); });
}); });
......
...@@ -224,29 +224,41 @@ describe('mrWidgetOptions', () => { ...@@ -224,29 +224,41 @@ describe('mrWidgetOptions', () => {
describe('handleMounted', () => { describe('handleMounted', () => {
it('should call required methods to do the initial kick-off', () => { it('should call required methods to do the initial kick-off', () => {
spyOn(vm, 'initDeploymentsPolling'); spyOn(vm, 'initDeploymentsPolling');
spyOn(vm, 'setFavicon'); spyOn(vm, 'setFaviconHelper');
vm.handleMounted(); vm.handleMounted();
expect(vm.setFavicon).toHaveBeenCalled(); expect(vm.setFaviconHelper).toHaveBeenCalled();
expect(vm.initDeploymentsPolling).toHaveBeenCalled(); expect(vm.initDeploymentsPolling).toHaveBeenCalled();
}); });
}); });
describe('setFavicon', () => { describe('setFavicon', () => {
let faviconElement;
beforeEach(() => {
const favicon = document.createElement('link');
favicon.setAttribute('id', 'favicon');
document.body.appendChild(favicon);
faviconElement = document.getElementById('favicon');
});
afterEach(() => {
document.body.removeChild(document.getElementById('favicon'));
});
it('should call setFavicon method', () => { it('should call setFavicon method', () => {
spyOn(gl.utils, 'setFavicon'); vm.setFaviconHelper();
vm.setFavicon();
expect(gl.utils.setFavicon).toHaveBeenCalledWith(vm.mr.ciStatusFaviconPath); expect(faviconElement.getAttribute('href')).toEqual(vm.mr.ciStatusFaviconPath);
}); });
it('should not call setFavicon when there is no ciStatusFaviconPath', () => { it('should not call setFavicon when there is no ciStatusFaviconPath', () => {
spyOn(gl.utils, 'setFavicon');
vm.mr.ciStatusFaviconPath = null; vm.mr.ciStatusFaviconPath = null;
vm.setFavicon(); vm.setFaviconHelper();
expect(gl.utils.setFavicon).not.toHaveBeenCalled(); expect(faviconElement.getAttribute('href')).toEqual(null);
}); });
}); });
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment