123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128 |
- <template lang="pug">
- transition(:duration="400")
- .modal(v-show='isShown', v-cloak)
- transition(name='modal-background')
- .modal-background(v-show='isShown')
- .modal-container
- transition(name='modal-content')
- .modal-content.is-expanded(v-show='isShown')
- header.is-green
- span {{ $t('editor.codeblocktitle') }}
- p.modal-notify(v-bind:class='{ "is-active": isLoading }')
- span {{ $t('editor.codeblockloading', { name: modeSelected }) }}
- i
- section.is-gapless
- .columns.is-stretched
- .column.is-one-quarter.modal-sidebar.is-green(style={'max-width':'350px'})
- .model-sidebar-header {{ $t('editor.codeblocklanguage') }}
- .model-sidebar-content
- p.control.is-fullwidth
- select(v-model='modeSelected')
- option(v-for='mode in modes', v-bind:value='mode.name') {{ mode.caption }}
- .column.ace-container
- #codeblock-editor
- footer
- a.button.is-grey.is-outlined(v-on:click='cancel') {{ $t('editor.discard') }}
- a.button.is-green(v-on:click='insertCode') {{ $t('editor.codeblockinsert') }}
- </template>
- <script>
- let codeEditor
- let ace
- export default {
- name: 'editor-codeblock',
- data() {
- return {
- modes: [],
- modeSelected: 'text',
- modelistLoaded: [],
- isLoading: false
- }
- },
- computed: {
- content() {
- return this.$store.state.editorCodeblock.content
- },
- isShown() {
- return this.$store.state.editorCodeblock.shown
- }
- },
- watch: {
- modeSelected(val, oldVal) {
- this.loadMode(val)
- }
- },
- methods: {
- init() {
- let self = this
- self._.delay(() => {
- codeEditor = ace.edit('codeblock-editor')
- codeEditor.setTheme('ace/theme/tomorrow_night')
- codeEditor.getSession().setMode('ace/mode/' + self.modeSelected)
- codeEditor.setOption('fontSize', '14px')
- codeEditor.setOption('hScrollBarAlwaysVisible', false)
- codeEditor.setOption('wrap', true)
- codeEditor.setOption('useSoftTabs', true)
- codeEditor.setOption('tabSize', 2)
- codeEditor.setOption('showPrintMargin', false)
- codeEditor.setValue(self.content)
- codeEditor.focus()
- codeEditor.renderer.updateFull()
- }, 100)
- },
- loadMode(m) {
- let self = this
- if (self._.includes(self.modelistLoaded, m)) {
- codeEditor.getSession().setMode('ace/mode/' + m)
- } else {
- self.isLoading = true
- self.$http.get('/js/ace/mode-' + m + '.js').then(resp => {
- if (resp.ok) {
- eval(resp.bodyText)
- self.modelistLoaded.push(m)
- ace.acequire('ace/mode/' + m)
- codeEditor.getSession().setMode('ace/mode/' + m)
- self._.delay(() => { self.isLoading = false }, 500)
- } else {
- this.$store.dispatch('alert', {
- style: 'red',
- icon: 'ui-2_square-remove-09',
- msg: self.$t('editor.codeblockloadingerror')
- })
- }
- }).catch(err => {
- this.$store.dispatch('alert', {
- style: 'red',
- icon: 'ui-2_square-remove-09',
- msg: 'Error: ' + err.body.msg
- })
- })
- }
- },
- cancel() {
- codeEditor.destroy()
- this.$store.dispatch('editorCodeblock/close')
- },
- insertCode() {
- let codeBlockText = '\n```' + this.modeSelected + '\n' + codeEditor.getValue() + '\n```\n'
- this.$store.dispatch('editor/insert', codeBlockText)
- this.$store.dispatch('alert', {
- style: 'blue',
- icon: 'files_archive-3d-check',
- msg: this.$t('editor.codeblocksuccess')
- })
- this.cancel()
- }
- },
- mounted() {
- FuseBox.import('/js/ace/ace.js', (acePkg) => {
- ace = acePkg
- this.modes = ace.acequire('ace/ext/modelist').modesByName
- })
- this.$root.$on('editorCodeblock/init', this.init)
- }
- }
- </script>
|