Commit cfbbdde3 authored by Fatih Acet's avatar Fatih Acet

Merge branch '30264-fix-vue-pagination' into 'master'

Fixes method not replacing URL parameters correctly

Closes #30264

See merge request !10351
parents 8a6104d0 670e1d74
...@@ -263,7 +263,7 @@ ...@@ -263,7 +263,7 @@
}); });
/** /**
* Updates the search parameter of a URL given the parameter and values provided. * Updates the search parameter of a URL given the parameter and value provided.
* *
* If no search params are present we'll add it. * If no search params are present we'll add it.
* If param for page is already present, we'll update it * If param for page is already present, we'll update it
...@@ -278,17 +278,24 @@ ...@@ -278,17 +278,24 @@
let search; let search;
const locationSearch = window.location.search; const locationSearch = window.location.search;
if (locationSearch.length === 0) { if (locationSearch.length) {
search = `?${param}=${value}`; const parameters = locationSearch.substring(1, locationSearch.length)
} .split('&')
.reduce((acc, element) => {
const val = element.split('=');
acc[val[0]] = decodeURIComponent(val[1]);
return acc;
}, {});
if (locationSearch.indexOf(param) !== -1) { parameters[param] = value;
const regex = new RegExp(param + '=\\d');
search = locationSearch.replace(regex, `${param}=${value}`);
}
if (locationSearch.length && locationSearch.indexOf(param) === -1) { const toString = Object.keys(parameters)
search = `${locationSearch}&${param}=${value}`; .map(val => `${val}=${encodeURIComponent(parameters[val])}`)
.join('&');
search = `?${toString}`;
} else {
search = `?${param}=${value}`;
} }
return search; return search;
......
---
title: Fixes method not replacing URL parameters correctly and breaking pipelines
pagination
merge_request:
author:
...@@ -91,6 +91,10 @@ describe('Environment', () => { ...@@ -91,6 +91,10 @@ describe('Environment', () => {
}); });
describe('pagination', () => { describe('pagination', () => {
afterEach(() => {
window.history.pushState({}, null, '');
});
it('should render pagination', (done) => { it('should render pagination', (done) => {
setTimeout(() => { setTimeout(() => {
expect( expect(
......
...@@ -46,6 +46,10 @@ require('~/lib/utils/common_utils'); ...@@ -46,6 +46,10 @@ require('~/lib/utils/common_utils');
spyOn(window.document, 'getElementById').and.callThrough(); spyOn(window.document, 'getElementById').and.callThrough();
}); });
afterEach(() => {
window.history.pushState({}, null, '');
});
function expectGetElementIdToHaveBeenCalledWith(elementId) { function expectGetElementIdToHaveBeenCalledWith(elementId) {
expect(window.document.getElementById).toHaveBeenCalledWith(elementId); expect(window.document.getElementById).toHaveBeenCalledWith(elementId);
} }
...@@ -75,11 +79,56 @@ require('~/lib/utils/common_utils'); ...@@ -75,11 +79,56 @@ require('~/lib/utils/common_utils');
}); });
}); });
describe('gl.utils.setParamInURL', () => {
afterEach(() => {
window.history.pushState({}, null, '');
});
it('should return the parameter', () => {
window.history.replaceState({}, null, '');
expect(gl.utils.setParamInURL('page', 156)).toBe('?page=156');
expect(gl.utils.setParamInURL('page', '156')).toBe('?page=156');
});
it('should update the existing parameter when its a number', () => {
window.history.pushState({}, null, '?page=15');
expect(gl.utils.setParamInURL('page', 16)).toBe('?page=16');
expect(gl.utils.setParamInURL('page', '16')).toBe('?page=16');
expect(gl.utils.setParamInURL('page', true)).toBe('?page=true');
});
it('should update the existing parameter when its a string', () => {
window.history.pushState({}, null, '?scope=all');
expect(gl.utils.setParamInURL('scope', 'finished')).toBe('?scope=finished');
});
it('should update the existing parameter when more than one parameter exists', () => {
window.history.pushState({}, null, '?scope=all&page=15');
expect(gl.utils.setParamInURL('scope', 'finished')).toBe('?scope=finished&page=15');
});
it('should add a new parameter to the end of the existing ones', () => {
window.history.pushState({}, null, '?scope=all');
expect(gl.utils.setParamInURL('page', 16)).toBe('?scope=all&page=16');
expect(gl.utils.setParamInURL('page', '16')).toBe('?scope=all&page=16');
expect(gl.utils.setParamInURL('page', true)).toBe('?scope=all&page=true');
});
});
describe('gl.utils.getParameterByName', () => { describe('gl.utils.getParameterByName', () => {
beforeEach(() => { beforeEach(() => {
window.history.pushState({}, null, '?scope=all&p=2'); window.history.pushState({}, null, '?scope=all&p=2');
}); });
afterEach(() => {
window.history.replaceState({}, null, null);
});
it('should return valid parameter', () => { it('should return valid parameter', () => {
const value = gl.utils.getParameterByName('scope'); const value = gl.utils.getParameterByName('scope');
expect(value).toBe('all'); expect(value).toBe('all');
......
...@@ -124,6 +124,10 @@ describe('Pagination component', () => { ...@@ -124,6 +124,10 @@ describe('Pagination component', () => {
}); });
describe('paramHelper', () => { describe('paramHelper', () => {
afterEach(() => {
window.history.pushState({}, null, '');
});
it('can parse url parameters correctly', () => { it('can parse url parameters correctly', () => {
window.history.pushState({}, null, '?scope=all&p=2'); window.history.pushState({}, null, '?scope=all&p=2');
......
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