gitlab-org--gitlab-foss/app/assets/javascripts/repo/components/repo_editor.vue

132 lines
2.9 KiB
Vue
Raw Normal View History

<script>
2017-07-24 12:15:41 -04:00
/* global monaco */
import Store from '../stores/repo_store';
import Service from '../services/repo_service';
import Helper from '../helpers/repo_helper';
2017-07-24 12:15:41 -04:00
const RepoEditor = {
data() {
return Store;
},
2017-07-24 12:15:41 -04:00
2017-08-03 22:11:14 -04:00
destroyed() {
2017-08-15 15:53:41 -04:00
if (Helper.monacoInstance) {
Helper.monacoInstance.destroy();
}
2017-08-03 22:11:14 -04:00
},
2017-07-24 12:15:41 -04:00
mounted() {
if (!this.activeFile.tempFile) {
Service.getRaw(this.activeFile.raw_path)
.then((rawResponse) => {
Store.blobRaw = rawResponse.data;
Store.activeFile.plain = rawResponse.data;
this.createMonacoInstance();
})
.catch(Helper.loadingError);
} else {
this.createMonacoInstance();
}
},
2017-07-24 13:42:11 -04:00
methods: {
createMonacoInstance() {
const monacoInstance = Helper.monaco.editor.create(this.$el, {
model: null,
readOnly: false,
contextmenu: true,
scrollBeyondLastLine: false,
});
2017-07-24 13:42:11 -04:00
Helper.monacoInstance = monacoInstance;
2017-07-24 12:15:41 -04:00
this.addMonacoEvents();
2017-07-24 12:15:41 -04:00
this.setupEditor();
},
2017-08-15 15:53:41 -04:00
setupEditor() {
this.showHide();
Helper.setMonacoModelFromLanguage();
},
showHide() {
if (!this.openedFiles.length || (this.binary && !this.activeFile.raw)) {
this.$el.style.display = 'none';
} else {
this.$el.style.display = 'inline-block';
}
},
2017-07-24 12:15:41 -04:00
addMonacoEvents() {
2017-08-15 15:53:41 -04:00
Helper.monacoInstance.onMouseUp(this.onMonacoEditorMouseUp);
Helper.monacoInstance.onKeyUp(this.onMonacoEditorKeysPressed.bind(this));
2017-07-24 12:15:41 -04:00
},
onMonacoEditorKeysPressed() {
2017-08-15 15:53:41 -04:00
Store.setActiveFileContents(Helper.monacoInstance.getValue());
2017-07-24 12:15:41 -04:00
},
onMonacoEditorMouseUp(e) {
2017-08-15 15:53:41 -04:00
if (!e.target.position) return;
2017-08-06 11:39:02 -04:00
const lineNumber = e.target.position.lineNumber;
2017-08-15 15:53:41 -04:00
if (e.target.element.classList.contains('line-numbers')) {
2017-08-06 11:39:02 -04:00
location.hash = `L${lineNumber}`;
Store.setActiveLine(lineNumber);
2017-07-24 12:15:41 -04:00
}
2017-07-26 08:56:31 -04:00
},
2017-07-24 12:15:41 -04:00
},
watch: {
dialog: {
handler(obj) {
2017-08-04 08:13:32 -04:00
const newObj = obj;
2017-08-03 22:11:14 -04:00
if (newObj.status) {
newObj.status = false;
2017-08-15 15:53:41 -04:00
this.openedFiles = this.openedFiles.map((file) => {
2017-08-01 11:34:50 -04:00
const f = file;
2017-08-01 09:41:24 -04:00
if (f.active) {
this.blobRaw = f.plain;
}
f.changed = false;
delete f.newContent;
2017-08-01 11:34:50 -04:00
return f;
});
this.editMode = false;
2017-08-15 15:53:41 -04:00
Store.toggleBlobView();
}
},
deep: true,
},
2017-07-24 12:15:41 -04:00
blobRaw() {
if (Helper.monacoInstance) {
2017-08-15 15:53:41 -04:00
this.setupEditor();
}
2017-07-24 12:15:41 -04:00
},
2017-10-05 05:54:46 -04:00
activeLine() {
if (Helper.monacoInstance) {
Helper.monacoInstance.setPosition({
lineNumber: this.activeLine,
column: 1,
});
}
},
2017-07-24 12:15:41 -04:00
},
2017-08-15 14:16:42 -04:00
computed: {
shouldHideEditor() {
return !this.openedFiles.length || (this.binary && !this.activeFile.raw);
},
},
2017-07-24 12:15:41 -04:00
};
export default RepoEditor;
</script>
2017-07-24 12:15:41 -04:00
<template>
2017-08-15 14:16:42 -04:00
<div id="ide" v-if='!shouldHideEditor'></div>
</template>