| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222 | <template lang='pug'>  v-card.editor-modal-conflict.animated.fadeIn(flat, tile)    .pa-4      v-toolbar.radius-7(flat, color='indigo', style='border-bottom-left-radius: 0; border-bottom-right-radius: 0;', dark)        v-icon.mr-3 mdi-merge        .subtitle-1 {{$t('editor:conflict.title')}}        v-spacer        v-btn(outlined, color='white', @click='useLocal', :title='$t(`editor:conflict.useLocalHint`)')          v-icon(left) mdi-alpha-l-box          span {{$t('editor:conflict.useLocal')}}        v-dialog(          v-model='isRemoteConfirmDiagShown'          width='500'          )          template(v-slot:activator='{ on }')            v-btn.ml-3(outlined, color='white', v-on='on', :title='$t(`editor:conflict.useRemoteHint`)')              v-icon(left) mdi-alpha-r-box              span {{$t('editor:conflict.useRemote')}}          v-card            .dialog-header.is-short.is-indigo              v-icon.mr-3(color='white') mdi-alpha-r-box              span {{$t('editor:conflict.overwrite.title')}}            v-card-text.pa-4              i18next.body-2(tag='div', path='editor:conflict.overwrite.description')                strong(place='refEditsLost') {{$t('editor:conflict.overwrite.editsLost')}}            v-card-chin              v-spacer              v-btn(outlined, color='indigo', @click='isRemoteConfirmDiagShown = false')                v-icon(left) mdi-close                span {{$t('common:actions.cancel')}}              v-btn(@click='useRemote', color='indigo', dark)                v-icon(left) mdi-check                span {{$t('common:actions.confirm')}}        v-divider.mx-3(vertical)        v-btn(outlined, color='indigo lighten-4', @click='close')          v-icon(left) mdi-close          span {{$t('common:actions.cancel')}}      v-row.indigo.darken-1.body-2(no-gutters)        v-col.pa-4          v-icon.mr-3(color='white') mdi-alpha-l-box          i18next.white--text(tag='span', path='editor:conflict.localVersion')            em.indigo--text.text--lighten-4(place='refEditable') {{$t('editor:conflict.editable')}}        v-divider(vertical)        v-col.pa-4          v-icon.mr-3(color='white') mdi-alpha-r-box          i18next.white--text(tag='span', path='editor:conflict.remoteVersion')            em.indigo--text.text--lighten-4(place='refReadOnly') {{$t('editor:conflict.readonly')}}      v-row.grey.lighten-2.body-2(no-gutters)        v-col.px-4.py-2          i18next.grey--text.text--darken-2(tag='em', path='editor:conflict.leftPanelInfo')            span(place='date', :title='$options.filters.moment(checkoutDateActive, `LLL`)') {{ checkoutDateActive | moment('from') }}        v-divider(vertical)        v-col.px-4.py-2          i18next.grey--text.text--darken-2(tag='em', path='editor:conflict.rightPanelInfo')            strong(place='authorName') {{latest.authorName}}            span(place='date', :title='$options.filters.moment(latest.updatedAt, `LLL`)') {{ latest.updatedAt | moment('from') }}      v-row.grey.lighten-3.grey--text.text--darken-3(no-gutters)        v-col.pa-4          .body-2            strong.indigo--text {{$t('editor:conflict.pageTitle')}}            strong.pl-2 {{title}}          .caption            strong.indigo--text {{$t('editor:conflict.pageDescription')}}            span.pl-2 {{description}}        v-divider(vertical, light)        v-col.pa-4          .body-2            strong.indigo--text {{$t('editor:conflict.pageTitle')}}            strong.pl-2 {{latest.title}}          .caption            strong.indigo--text {{$t('editor:conflict.pageDescription')}}            span.pl-2 {{latest.description}}      v-card.radius-7(:light='!$vuetify.theme.dark', :dark='$vuetify.theme.dark')        div(ref='cm')</template><script>import _ from 'lodash'import gql from 'graphql-tag'import { sync, get } from 'vuex-pathify'/* global siteConfig */// ========================================// IMPORTS// ========================================import '../../libs/codemirror-merge/diff-match-patch.js'// Code Mirrorimport CodeMirror from 'codemirror'import 'codemirror/lib/codemirror.css'// Languageimport 'codemirror/mode/markdown/markdown.js'import 'codemirror/mode/htmlmixed/htmlmixed.js'// Addonsimport 'codemirror/addon/selection/active-line.js'import 'codemirror/addon/merge/merge.js'import 'codemirror/addon/merge/merge.css'export default {  data() {    return {      cm: null,      latest: {        title: '',        description: '',        updatedAt: '',        authorName: ''      },      isRemoteConfirmDiagShown: false    }  },  computed: {    editorKey: get('editor/editorKey'),    activeModal: sync('editor/activeModal'),    pageId: get('page/id'),    title: get('page/title'),    description: get('page/description'),    updatedAt: get('page/updatedAt'),    checkoutDateActive: sync('editor/checkoutDateActive')  },  methods: {    close () {      this.isRemoteConfirmDiagShown = false      this.activeModal = ''    },    overwriteAndClose() {      this.checkoutDateActive = this.latest.updatedAt      this.$root.$emit('overwriteEditorContent')      this.$root.$emit('resetEditorConflict')      this.close()    },    useLocal () {      this.$store.set('editor/content', this.cm.edit.getValue())      this.overwriteAndClose()    },    useRemote () {      this.$store.set('editor/content', this.latest.content)      this.overwriteAndClose()    }  },  async mounted () {    let textMode = 'text/html'    switch (this.editorKey) {      case 'markdown':        textMode = 'text/markdown'        break    }    let resp = await this.$apollo.query({      query: gql`        query ($id: Int!) {          pages {            conflictLatest(id: $id) {              id              authorId              authorName              content              createdAt              description              isPublished              locale              path              tags              title              updatedAt            }          }        }      `,      fetchPolicy: 'network-only',      variables: {        id: this.$store.get('page/id')      }    })    resp = _.get(resp, 'data.pages.conflictLatest', false)    if (!resp) {      return this.$store.commit('showNotification', {        message: 'Failed to fetch latest version.',        style: 'warning',        icon: 'warning'      })    }    this.latest = resp    this.cm = CodeMirror.MergeView(this.$refs.cm, {      value: this.$store.get('editor/content'),      orig: resp.content,      tabSize: 2,      mode: textMode,      lineNumbers: true,      lineWrapping: true,      connect: null,      highlightDifferences: true,      styleActiveLine: true,      collapseIdentical: true,      direction: siteConfig.rtl ? 'rtl' : 'ltr'    })    this.cm.rightOriginal().setSize(null, 'calc(100vh - 265px)')    this.cm.editor().setSize(null, 'calc(100vh - 265px)')    this.cm.wrap.style.height = 'calc(100vh - 265px)'  }}</script><style lang='scss'>.editor-modal-conflict {  position: fixed !important;  top: 0;  left: 0;  z-index: 10;  width: 100%;  height: 100vh;  background-color: rgba(0, 0, 0, .9) !important;  overflow: auto;}</style>
 |