196 lines
5.1 KiB
JavaScript
196 lines
5.1 KiB
JavaScript
import Vue from 'vue';
|
|
import { visitUrl } from '../../lib/utils/url_utility';
|
|
import flash from '../../flash';
|
|
import service from '../services';
|
|
import * as types from './mutation_types';
|
|
import { stripHtml } from '../../lib/utils/text_utility';
|
|
|
|
export const redirectToUrl = (_, url) => visitUrl(url);
|
|
|
|
export const setInitialData = ({ commit }, data) =>
|
|
commit(types.SET_INITIAL_DATA, data);
|
|
|
|
export const closeDiscardPopup = ({ commit }) =>
|
|
commit(types.TOGGLE_DISCARD_POPUP, false);
|
|
|
|
export const discardAllChanges = ({ commit, getters, dispatch }) => {
|
|
const changedFiles = getters.changedFiles;
|
|
|
|
changedFiles.forEach((file) => {
|
|
commit(types.DISCARD_FILE_CHANGES, file);
|
|
|
|
if (file.tempFile) {
|
|
dispatch('closeFile', { file, force: true });
|
|
}
|
|
});
|
|
};
|
|
|
|
export const closeAllFiles = ({ state, dispatch }) => {
|
|
state.openFiles.forEach(file => dispatch('closeFile', { file }));
|
|
};
|
|
|
|
export const toggleEditMode = (
|
|
{ state, commit, getters, dispatch },
|
|
force = false,
|
|
) => {
|
|
const changedFiles = getters.changedFiles;
|
|
|
|
if (changedFiles.length && !force) {
|
|
commit(types.TOGGLE_DISCARD_POPUP, true);
|
|
} else {
|
|
commit(types.TOGGLE_EDIT_MODE);
|
|
commit(types.TOGGLE_DISCARD_POPUP, false);
|
|
dispatch('toggleBlobView');
|
|
|
|
if (!state.editMode) {
|
|
dispatch('discardAllChanges');
|
|
}
|
|
}
|
|
};
|
|
|
|
export const toggleBlobView = ({ commit, state }) => {
|
|
if (state.editMode) {
|
|
commit(types.SET_EDIT_MODE);
|
|
} else {
|
|
commit(types.SET_PREVIEW_MODE);
|
|
}
|
|
};
|
|
|
|
export const setPanelCollapsedStatus = ({ commit }, { side, collapsed }) => {
|
|
if (side === 'left') {
|
|
commit(types.SET_LEFT_PANEL_COLLAPSED, collapsed);
|
|
} else {
|
|
commit(types.SET_RIGHT_PANEL_COLLAPSED, collapsed);
|
|
}
|
|
};
|
|
|
|
export const setResizingStatus = ({ commit }, resizing) => {
|
|
commit(types.SET_RESIZING_STATUS, resizing);
|
|
};
|
|
|
|
export const checkCommitStatus = ({ state }) =>
|
|
service
|
|
.getBranchData(state.currentProjectId, state.currentBranchId)
|
|
.then(({ data }) => {
|
|
const { id } = data.commit;
|
|
const selectedBranch =
|
|
state.projects[state.currentProjectId].branches[state.currentBranchId];
|
|
|
|
if (selectedBranch.workingReference !== id) {
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
})
|
|
.catch(() => flash('Error checking branch data. Please try again.', 'alert', document, null, false, true));
|
|
|
|
export const commitChanges = (
|
|
{ commit, state, dispatch, getters },
|
|
{ payload, newMr },
|
|
) =>
|
|
service
|
|
.commit(state.currentProjectId, payload)
|
|
.then(({ data }) => {
|
|
const { branch } = payload;
|
|
if (!data.short_id) {
|
|
flash(data.message, 'alert', document, null, false, true);
|
|
return;
|
|
}
|
|
|
|
const selectedProject = state.projects[state.currentProjectId];
|
|
const lastCommit = {
|
|
commit_path: `${selectedProject.web_url}/commit/${data.id}`,
|
|
commit: {
|
|
message: data.message,
|
|
authored_date: data.committed_date,
|
|
},
|
|
};
|
|
|
|
let commitMsg = `Your changes have been committed. Commit ${data.short_id}`;
|
|
if (data.stats) {
|
|
commitMsg += ` with ${data.stats.additions} additions, ${data.stats.deletions} deletions.`;
|
|
}
|
|
|
|
flash(
|
|
commitMsg,
|
|
'notice',
|
|
document,
|
|
null,
|
|
false,
|
|
true);
|
|
window.dispatchEvent(new Event('resize'));
|
|
|
|
if (newMr) {
|
|
dispatch('discardAllChanges');
|
|
dispatch(
|
|
'redirectToUrl',
|
|
`${selectedProject.web_url}/merge_requests/new?merge_request%5Bsource_branch%5D=${branch}`,
|
|
);
|
|
} else {
|
|
commit(types.SET_BRANCH_WORKING_REFERENCE, {
|
|
projectId: state.currentProjectId,
|
|
branchId: state.currentBranchId,
|
|
reference: data.id,
|
|
});
|
|
|
|
getters.changedFiles.forEach((entry) => {
|
|
commit(types.SET_LAST_COMMIT_DATA, {
|
|
entry,
|
|
lastCommit,
|
|
});
|
|
});
|
|
|
|
dispatch('discardAllChanges');
|
|
|
|
window.scrollTo(0, 0);
|
|
}
|
|
})
|
|
.catch((err) => {
|
|
let errMsg = 'Error committing changes. Please try again.';
|
|
if (err.response.data && err.response.data.message) {
|
|
errMsg += ` (${stripHtml(err.response.data.message)})`;
|
|
}
|
|
flash(errMsg, 'alert', document, null, false, true);
|
|
window.dispatchEvent(new Event('resize'));
|
|
});
|
|
|
|
export const createTempEntry = (
|
|
{ state, dispatch },
|
|
{ projectId, branchId, parent, name, type, content = '', base64 = false },
|
|
) => {
|
|
const selectedParent = parent || state.trees[`${projectId}/${branchId}`];
|
|
if (type === 'tree') {
|
|
dispatch('createTempTree', {
|
|
projectId,
|
|
branchId,
|
|
parent: selectedParent,
|
|
name,
|
|
});
|
|
} else if (type === 'blob') {
|
|
dispatch('createTempFile', {
|
|
projectId,
|
|
branchId,
|
|
parent: selectedParent,
|
|
name,
|
|
base64,
|
|
content,
|
|
});
|
|
}
|
|
};
|
|
|
|
export const scrollToTab = () => {
|
|
Vue.nextTick(() => {
|
|
const tabs = document.getElementById('tabs');
|
|
|
|
if (tabs) {
|
|
const tabEl = tabs.querySelector('.active .repo-tab');
|
|
|
|
tabEl.focus();
|
|
}
|
|
});
|
|
};
|
|
|
|
export * from './actions/tree';
|
|
export * from './actions/file';
|
|
export * from './actions/project';
|
|
export * from './actions/branch';
|