| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241 | 
							- <template lang='pug'>
 
-   v-card
 
-     v-toolbar(flat, color='primary', dark, dense)
 
-       .subtitle-1 {{ $t('admin:utilities.contentTitle') }}
 
-     v-card-text
 
-       .subtitle-1.pb-3.primary--text Rebuild Page Tree
 
-       .body-2 The virtual structure of your wiki is automatically inferred from all page paths. You can trigger a full rebuild of the tree if some virtual folders are missing or not valid anymore.
 
-       v-btn(outlined, color='primary', @click='rebuildTree', :disabled='loading').ml-0.mt-3
 
-         v-icon(left) mdi-gesture-double-tap
 
-         span Proceed
 
-       v-divider.my-5
 
-       .subtitle-1.pb-3.primary--text Rerender All Pages
 
-       .body-2 All pages will be rendered again. Useful if internal links are broken or the rendering pipeline has changed.
 
-       v-btn(outlined, color='primary', @click='rerenderPages', :disabled='loading', :loading='isRerendering').ml-0.mt-3
 
-         v-icon(left) mdi-gesture-double-tap
 
-         span Proceed
 
-       v-dialog(
 
-         v-model='isRerendering'
 
-         persistent
 
-         max-width='450'
 
-         )
 
-         v-card(color='blue darken-2', dark)
 
-           v-card-text.pa-10.text-center
 
-             semipolar-spinner.animated.fadeIn(
 
-               :animation-duration='1500'
 
-               :size='65'
 
-               color='#FFF'
 
-               style='margin: 0 auto;'
 
-             )
 
-             .mt-5.body-1.white--text Rendering all pages...
 
-             .caption(v-if='renderIndex > 0') Rendering {{renderCurrentPath}}... ({{renderIndex}}/{{renderTotal}}, {{renderProgress}}%)
 
-             .caption.mt-4 Do not leave this page.
 
-             v-progress-linear.mt-5(
 
-               color='white'
 
-               :value='renderProgress'
 
-               stream
 
-               rounded
 
-               :buffer-value='0'
 
-             )
 
-       v-divider.my-5
 
-       .subtitle-1.pb-3.pl-0.primary--text Migrate all pages to target locale
 
-       .body-2 If you created content before selecting a different locale and activating the namespacing capabilities, you may want to transfer all content to the base locale.
 
-       .body-2.red--text: strong This operation is destructive and cannot be reversed! Make sure you have proper backups!
 
-       v-toolbar.radius-7.mt-5(flat, :color='$vuetify.theme.dark ? `grey darken-3-d5` : `grey lighten-4`', height='80')
 
-         v-select(
 
-           label='Source Locale'
 
-           outlined
 
-           hide-details
 
-           :items='locales'
 
-           item-text='name'
 
-           item-value='code'
 
-           v-model='sourceLocale'
 
-         )
 
-         v-icon.mx-3(large) mdi-chevron-right-box-outline
 
-         v-select(
 
-           label='Target Locale'
 
-           outlined
 
-           hide-details
 
-           :items='locales'
 
-           item-text='name'
 
-           item-value='code'
 
-           v-model='targetLocale'
 
-         )
 
-       .body-2.mt-5 Pages that are already in the target locale will not be touched. If a page already exists at the target, the source page will not be modified as it would create a conflict. If you want to overwrite the target page, you must first delete it.
 
-       v-btn(outlined, color='primary', @click='migrateToLocale', :disabled='loading').ml-0.mt-3
 
-         v-icon(left) mdi-gesture-double-tap
 
-         span Proceed
 
- </template>
 
- <script>
 
- import _ from 'lodash'
 
- import gql from 'graphql-tag'
 
- import utilityContentMigrateLocaleMutation from 'gql/admin/utilities/utilities-mutation-content-migratelocale.gql'
 
- import utilityContentRebuildTreeMutation from 'gql/admin/utilities/utilities-mutation-content-rebuildtree.gql'
 
- import { SemipolarSpinner } from 'epic-spinners'
 
- /* global siteLangs, siteConfig */
 
- export default {
 
-   components: {
 
-     SemipolarSpinner
 
-   },
 
-   data: () => {
 
-     return {
 
-       isRerendering: false,
 
-       loading: false,
 
-       renderProgress: 0,
 
-       renderIndex: 0,
 
-       renderTotal: 0,
 
-       renderCurrentPath: '',
 
-       sourceLocale: '',
 
-       targetLocale: ''
 
-     }
 
-   },
 
-   computed: {
 
-     currentLocale () {
 
-       return siteConfig.lang
 
-     },
 
-     locales () {
 
-       return siteLangs
 
-     }
 
-   },
 
-   methods: {
 
-     async rebuildTree () {
 
-       this.loading = true
 
-       this.$store.commit(`loadingStart`, 'admin-utilities-content-rebuildtree')
 
-       try {
 
-         const respRaw = await this.$apollo.mutate({
 
-           mutation: utilityContentRebuildTreeMutation
 
-         })
 
-         const resp = _.get(respRaw, 'data.pages.rebuildTree.responseResult', {})
 
-         if (resp.succeeded) {
 
-           this.$store.commit('showNotification', {
 
-             message: 'Page Tree rebuilt successfully.',
 
-             style: 'success',
 
-             icon: 'check'
 
-           })
 
-         } else {
 
-           throw new Error(resp.message)
 
-         }
 
-       } catch (err) {
 
-         this.$store.commit('pushGraphError', err)
 
-       }
 
-       this.$store.commit(`loadingStop`, 'admin-utilities-content-rebuildtree')
 
-       this.loading = false
 
-     },
 
-     async rerenderPages () {
 
-       this.loading = true
 
-       this.isRerendering = true
 
-       this.$store.commit(`loadingStart`, 'admin-utilities-content-rerender')
 
-       try {
 
-         const pagesRaw = await this.$apollo.query({
 
-           query: gql`
 
-             {
 
-               pages {
 
-                 list {
 
-                   id
 
-                   path
 
-                   locale
 
-                 }
 
-               }
 
-             }
 
-           `,
 
-           fetchPolicy: 'network-only'
 
-         })
 
-         if (_.get(pagesRaw, 'data.pages.list', []).length < 1) {
 
-           throw new Error('Could not find any page to render!')
 
-         }
 
-         this.renderIndex = 0
 
-         this.renderTotal = pagesRaw.data.pages.list.length
 
-         let failed = 0
 
-         for (const page of pagesRaw.data.pages.list) {
 
-           this.renderCurrentPath = `${page.locale}/${page.path}`
 
-           this.renderIndex++
 
-           this.renderProgress = Math.round(this.renderIndex / this.renderTotal * 100)
 
-           const respRaw = await this.$apollo.mutate({
 
-             mutation: gql`
 
-               mutation($id: Int!) {
 
-                 pages {
 
-                   render(id: $id) {
 
-                     responseResult {
 
-                       succeeded
 
-                       errorCode
 
-                       slug
 
-                       message
 
-                     }
 
-                   }
 
-                 }
 
-               }
 
-             `,
 
-             variables: {
 
-               id: page.id
 
-             }
 
-           })
 
-           const resp = _.get(respRaw, 'data.pages.render.responseResult', {})
 
-           if (!resp.succeeded) {
 
-             failed++
 
-           }
 
-         }
 
-         if (failed > 0) {
 
-           this.$store.commit('showNotification', {
 
-             message: `Completed with ${failed} pages that failed to render. Check server logs for details.`,
 
-             style: 'error',
 
-             icon: 'alert'
 
-           })
 
-         } else {
 
-           this.$store.commit('showNotification', {
 
-             message: 'All pages have been rendered successfully.',
 
-             style: 'success',
 
-             icon: 'check'
 
-           })
 
-         }
 
-       } catch (err) {
 
-         this.$store.commit('pushGraphError', err)
 
-       }
 
-       this.$store.commit(`loadingStop`, 'admin-utilities-content-rerender')
 
-       this.isRerendering = false
 
-       this.loading = false
 
-     },
 
-     async migrateToLocale () {
 
-       this.loading = true
 
-       this.$store.commit(`loadingStart`, 'admin-utilities-content-migratelocale')
 
-       try {
 
-         const respRaw = await this.$apollo.mutate({
 
-           mutation: utilityContentMigrateLocaleMutation,
 
-           variables: {
 
-             sourceLocale: this.sourceLocale,
 
-             targetLocale: this.targetLocale
 
-           }
 
-         })
 
-         const resp = _.get(respRaw, 'data.pages.migrateToLocale.responseResult', {})
 
-         if (resp.succeeded) {
 
-           this.$store.commit('showNotification', {
 
-             message: `Migrated ${_.get(respRaw, 'data.pages.migrateToLocale.count', 0)} page(s) to target locale successfully.`,
 
-             style: 'success',
 
-             icon: 'check'
 
-           })
 
-         } else {
 
-           throw new Error(resp.message)
 
-         }
 
-       } catch (err) {
 
-         this.$store.commit('pushGraphError', err)
 
-       }
 
-       this.$store.commit(`loadingStop`, 'admin-utilities-content-migratelocale')
 
-       this.loading = false
 
-     }
 
-   }
 
- }
 
- </script>
 
- <style lang='scss'>
 
- </style>
 
 
  |