parent
d8dd75ca77
commit
be45d45404
|
@ -40,13 +40,6 @@ export default {
|
|||
|
||||
return __('Create file');
|
||||
},
|
||||
formLabelName() {
|
||||
if (this.type === 'tree') {
|
||||
return __('Directory name');
|
||||
}
|
||||
|
||||
return __('File name');
|
||||
},
|
||||
},
|
||||
mounted() {
|
||||
this.$refs.fieldName.focus();
|
||||
|
@ -83,7 +76,7 @@ export default {
|
|||
>
|
||||
<fieldset class="form-group append-bottom-0">
|
||||
<label class="label-light col-sm-3">
|
||||
{{ formLabelName }}
|
||||
{{ __('Name') }}
|
||||
</label>
|
||||
<div class="col-sm-9">
|
||||
<input
|
||||
|
|
|
@ -112,6 +112,14 @@ export const updateDelayViewerUpdated = ({ commit }, delay) => {
|
|||
commit(types.UPDATE_DELAY_VIEWER_CHANGE, delay);
|
||||
};
|
||||
|
||||
export const updateTempFlagForEntry = ({ commit, dispatch, state }, { entry, tempFile }) => {
|
||||
commit(types.UPDATE_TEMP_FLAG, { path: entry.path, tempFile });
|
||||
|
||||
if (entry.parentPath) {
|
||||
dispatch('updateTempFlagForEntry', { entry: state.entries[entry.parentPath], tempFile });
|
||||
}
|
||||
};
|
||||
|
||||
export * from './actions/tree';
|
||||
export * from './actions/file';
|
||||
export * from './actions/project';
|
||||
|
|
|
@ -127,6 +127,8 @@ export const updateFilesAfterCommit = (
|
|||
},
|
||||
{ root: true },
|
||||
);
|
||||
|
||||
dispatch('updateTempFlagForEntry', { entry, tempFile: false }, { root: true });
|
||||
});
|
||||
|
||||
commit(rootTypes.REMOVE_ALL_CHANGES_FILES, null, { root: true });
|
||||
|
|
|
@ -53,3 +53,5 @@ export const UPDATE_DELAY_VIEWER_CHANGE = 'UPDATE_DELAY_VIEWER_CHANGE';
|
|||
|
||||
export const ADD_PENDING_TAB = 'ADD_PENDING_TAB';
|
||||
export const REMOVE_PENDING_TAB = 'REMOVE_PENDING_TAB';
|
||||
|
||||
export const UPDATE_TEMP_FLAG = 'UPDATE_TEMP_FLAG';
|
||||
|
|
|
@ -4,6 +4,7 @@ import mergeRequestMutation from './mutations/merge_request';
|
|||
import fileMutations from './mutations/file';
|
||||
import treeMutations from './mutations/tree';
|
||||
import branchMutations from './mutations/branch';
|
||||
import { sortTree } from './utils';
|
||||
|
||||
export default {
|
||||
[types.SET_INITIAL_DATA](state, data) {
|
||||
|
@ -68,7 +69,7 @@ export default {
|
|||
f => foundEntry.tree.find(e => e.path === f.path) === undefined,
|
||||
);
|
||||
Object.assign(foundEntry, {
|
||||
tree: foundEntry.tree.concat(tree),
|
||||
tree: sortTree(foundEntry.tree.concat(tree)),
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -81,10 +82,16 @@ export default {
|
|||
|
||||
if (!foundEntry) {
|
||||
Object.assign(state.trees[`${projectId}/${branchId}`], {
|
||||
tree: state.trees[`${projectId}/${branchId}`].tree.concat(data.treeList),
|
||||
tree: sortTree(state.trees[`${projectId}/${branchId}`].tree.concat(data.treeList)),
|
||||
});
|
||||
}
|
||||
},
|
||||
[types.UPDATE_TEMP_FLAG](state, { path, tempFile }) {
|
||||
Object.assign(state.entries[path], {
|
||||
tempFile,
|
||||
changed: tempFile,
|
||||
});
|
||||
},
|
||||
[types.UPDATE_VIEWER](state, viewer) {
|
||||
Object.assign(state, {
|
||||
viewer,
|
||||
|
|
|
@ -32,6 +32,7 @@ export const dataStructure = () => ({
|
|||
raw: '',
|
||||
content: '',
|
||||
parentTreeUrl: '',
|
||||
parentPath: '',
|
||||
renderError: false,
|
||||
base64: false,
|
||||
editorRow: 1,
|
||||
|
@ -63,6 +64,7 @@ export const decorateData = entity => {
|
|||
previewMode,
|
||||
file_lock,
|
||||
html,
|
||||
parentPath = '',
|
||||
} = entity;
|
||||
|
||||
return {
|
||||
|
@ -79,6 +81,7 @@ export const decorateData = entity => {
|
|||
opened,
|
||||
active,
|
||||
parentTreeUrl,
|
||||
parentPath,
|
||||
changed,
|
||||
renderError,
|
||||
content,
|
||||
|
@ -119,8 +122,8 @@ const sortTreesByTypeAndName = (a, b) => {
|
|||
} else if (a.type === 'blob' && b.type === 'tree') {
|
||||
return 1;
|
||||
}
|
||||
if (a.name.toLowerCase() < b.name.toLowerCase()) return -1;
|
||||
if (a.name.toLowerCase() > b.name.toLowerCase()) return 1;
|
||||
if (a.name < b.name) return -1;
|
||||
if (a.name > b.name) return 1;
|
||||
return 0;
|
||||
};
|
||||
|
||||
|
|
|
@ -29,6 +29,7 @@ self.addEventListener('message', e => {
|
|||
tempFile,
|
||||
changed: tempFile,
|
||||
opened: tempFile,
|
||||
parentPath: parentFolder ? parentFolder.path : null,
|
||||
});
|
||||
|
||||
Object.assign(acc, {
|
||||
|
@ -66,6 +67,7 @@ self.addEventListener('message', e => {
|
|||
content,
|
||||
base64,
|
||||
previewMode: viewerInformationForPath(blobName),
|
||||
parentPath: fileFolder ? fileFolder.path : null,
|
||||
});
|
||||
|
||||
Object.assign(acc, {
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
<script>
|
||||
import getIconForFile from './file_icon/file_icon_map';
|
||||
import loadingIcon from '../../vue_shared/components/loading_icon.vue';
|
||||
import icon from '../../vue_shared/components/icon.vue';
|
||||
import getIconForFile from './file_icon/file_icon_map';
|
||||
import loadingIcon from '../../vue_shared/components/loading_icon.vue';
|
||||
import icon from '../../vue_shared/components/icon.vue';
|
||||
|
||||
/* This is a re-usable vue component for rendering a svg sprite
|
||||
/* This is a re-usable vue component for rendering a svg sprite
|
||||
icon
|
||||
|
||||
Sample configuration:
|
||||
|
@ -15,60 +15,60 @@
|
|||
/>
|
||||
|
||||
*/
|
||||
export default {
|
||||
components: {
|
||||
loadingIcon,
|
||||
icon,
|
||||
export default {
|
||||
components: {
|
||||
loadingIcon,
|
||||
icon,
|
||||
},
|
||||
props: {
|
||||
fileName: {
|
||||
type: String,
|
||||
required: true,
|
||||
},
|
||||
props: {
|
||||
fileName: {
|
||||
type: String,
|
||||
required: true,
|
||||
},
|
||||
|
||||
folder: {
|
||||
type: Boolean,
|
||||
required: false,
|
||||
default: false,
|
||||
},
|
||||
|
||||
opened: {
|
||||
type: Boolean,
|
||||
required: false,
|
||||
default: false,
|
||||
},
|
||||
|
||||
loading: {
|
||||
type: Boolean,
|
||||
required: false,
|
||||
default: false,
|
||||
},
|
||||
|
||||
size: {
|
||||
type: Number,
|
||||
required: false,
|
||||
default: 16,
|
||||
},
|
||||
|
||||
cssClasses: {
|
||||
type: String,
|
||||
required: false,
|
||||
default: '',
|
||||
},
|
||||
folder: {
|
||||
type: Boolean,
|
||||
required: false,
|
||||
default: false,
|
||||
},
|
||||
computed: {
|
||||
spriteHref() {
|
||||
const iconName = getIconForFile(this.fileName) || 'file';
|
||||
return `${gon.sprite_file_icons}#${iconName}`;
|
||||
},
|
||||
folderIconName() {
|
||||
return this.opened ? 'folder-open' : 'folder';
|
||||
},
|
||||
iconSizeClass() {
|
||||
return this.size ? `s${this.size}` : '';
|
||||
},
|
||||
|
||||
opened: {
|
||||
type: Boolean,
|
||||
required: false,
|
||||
default: false,
|
||||
},
|
||||
};
|
||||
|
||||
loading: {
|
||||
type: Boolean,
|
||||
required: false,
|
||||
default: false,
|
||||
},
|
||||
|
||||
size: {
|
||||
type: Number,
|
||||
required: false,
|
||||
default: 16,
|
||||
},
|
||||
|
||||
cssClasses: {
|
||||
type: String,
|
||||
required: false,
|
||||
default: '',
|
||||
},
|
||||
},
|
||||
computed: {
|
||||
spriteHref() {
|
||||
const iconName = getIconForFile(this.fileName) || 'file';
|
||||
return `${gon.sprite_file_icons}#${iconName}`;
|
||||
},
|
||||
folderIconName() {
|
||||
return this.opened ? 'folder-open' : 'folder';
|
||||
},
|
||||
iconSizeClass() {
|
||||
return this.size ? `s${this.size}` : '';
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
<template>
|
||||
<span>
|
||||
|
@ -82,6 +82,7 @@
|
|||
v-if="!loading && folder"
|
||||
:name="folderIconName"
|
||||
:size="size"
|
||||
css-classes="folder-icon"
|
||||
/>
|
||||
<loading-icon
|
||||
v-if="loading"
|
||||
|
|
|
@ -85,10 +85,8 @@
|
|||
}
|
||||
}
|
||||
|
||||
&.folder {
|
||||
svg {
|
||||
fill: $gl-text-color-secondary;
|
||||
}
|
||||
.folder-icon {
|
||||
fill: $gl-text-color-secondary;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -429,7 +427,7 @@
|
|||
.projects-sidebar {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
height: 100%;
|
||||
flex: 1;
|
||||
|
||||
.context-header {
|
||||
width: auto;
|
||||
|
|
|
@ -1,7 +1,9 @@
|
|||
import * as urlUtils from '~/lib/utils/url_utility';
|
||||
import * as actions from '~/ide/stores/actions';
|
||||
import store from '~/ide/stores';
|
||||
import router from '~/ide/ide_router';
|
||||
import { resetStore, file } from '../helpers';
|
||||
import testAction from '../../helpers/vuex_action_helper';
|
||||
|
||||
describe('Multi-file store actions', () => {
|
||||
beforeEach(() => {
|
||||
|
@ -191,9 +193,7 @@ describe('Multi-file store actions', () => {
|
|||
})
|
||||
.then(f => {
|
||||
expect(f.tempFile).toBeTruthy();
|
||||
expect(store.state.trees['abcproject/mybranch'].tree.length).toBe(
|
||||
1,
|
||||
);
|
||||
expect(store.state.trees['abcproject/mybranch'].tree.length).toBe(1);
|
||||
|
||||
done();
|
||||
})
|
||||
|
@ -303,4 +303,47 @@ describe('Multi-file store actions', () => {
|
|||
.catch(done.fail);
|
||||
});
|
||||
});
|
||||
|
||||
describe('updateTempFlagForEntry', () => {
|
||||
it('commits UPDATE_TEMP_FLAG', done => {
|
||||
const f = {
|
||||
...file(),
|
||||
path: 'test',
|
||||
tempFile: true,
|
||||
};
|
||||
store.state.entries[f.path] = f;
|
||||
|
||||
testAction(
|
||||
actions.updateTempFlagForEntry,
|
||||
{ entry: f, tempFile: false },
|
||||
store.state,
|
||||
[{ type: 'UPDATE_TEMP_FLAG', payload: { path: f.path, tempFile: false } }],
|
||||
[],
|
||||
done,
|
||||
);
|
||||
});
|
||||
|
||||
it('commits UPDATE_TEMP_FLAG and dispatches for parent', done => {
|
||||
const parent = {
|
||||
...file(),
|
||||
path: 'testing',
|
||||
};
|
||||
const f = {
|
||||
...file(),
|
||||
path: 'test',
|
||||
parentPath: 'testing',
|
||||
};
|
||||
store.state.entries[parent.path] = parent;
|
||||
store.state.entries[f.path] = f;
|
||||
|
||||
testAction(
|
||||
actions.updateTempFlagForEntry,
|
||||
{ entry: f, tempFile: false },
|
||||
store.state,
|
||||
[{ type: 'UPDATE_TEMP_FLAG', payload: { path: f.path, tempFile: false } }],
|
||||
[{ type: 'updateTempFlagForEntry', payload: { entry: parent, tempFile: false } }],
|
||||
done,
|
||||
);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
|
|
@ -76,4 +76,26 @@ describe('Multi-file store mutations', () => {
|
|||
expect(localState.viewer).toBe('diff');
|
||||
});
|
||||
});
|
||||
|
||||
describe('UPDATE_TEMP_FLAG', () => {
|
||||
beforeEach(() => {
|
||||
localState.entries.test = {
|
||||
...file(),
|
||||
tempFile: true,
|
||||
changed: true,
|
||||
};
|
||||
});
|
||||
|
||||
it('updates tempFile flag', () => {
|
||||
mutations.UPDATE_TEMP_FLAG(localState, { path: 'test', tempFile: false });
|
||||
|
||||
expect(localState.entries.test.tempFile).toBe(false);
|
||||
});
|
||||
|
||||
it('updates changed flag', () => {
|
||||
mutations.UPDATE_TEMP_FLAG(localState, { path: 'test', tempFile: false });
|
||||
|
||||
expect(localState.entries.test.changed).toBe(false);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
|
Loading…
Reference in New Issue