app.js 5.69 KB
Newer Older
1
'use strict'
2

3
/* global $, siteRoot */
4
/* eslint-disable no-new */
NGPixel's avatar
NGPixel committed
5

6
import Vue from 'vue'
7
import VueResource from 'vue-resource'
8
import VueClipboards from 'vue-clipboards'
9
import VueLodash from 'vue-lodash'
10
import store from './store'
11
import io from 'socket-io-client'
12 13 14
import i18next from 'i18next'
import i18nextXHR from 'i18next-xhr-backend'
import VueI18Next from '@panter/vue-i18next'
15 16
import 'jquery-contextmenu'
import 'jquery-simple-upload'
17
import 'jquery-smooth-scroll'
18
import 'jquery-sticky'
19

20 21 22 23 24
// ====================================
// Load Helpers
// ====================================

import helpers from './helpers'
25
import _ from './helpers/lodash'
26

27 28 29 30
// ====================================
// Load Vue Components
// ====================================

31
import alertComponent from './components/alert.vue'
32 33
import anchorComponent from './components/anchor.vue'
import colorPickerComponent from './components/color-picker.vue'
34
import editorCodeblockComponent from './components/editor-codeblock.vue'
35
import editorFileComponent from './components/editor-file.vue'
36
import editorVideoComponent from './components/editor-video.vue'
37
import historyComponent from './components/history.vue'
38
import loadingSpinnerComponent from './components/loading-spinner.vue'
39 40
import modalCreatePageComponent from './components/modal-create-page.vue'
import modalCreateUserComponent from './components/modal-create-user.vue'
NGPixel's avatar
NGPixel committed
41
import modalDeletePageComponent from './components/modal-delete-page.vue'
42
import modalDeleteUserComponent from './components/modal-delete-user.vue'
43
import modalDiscardPageComponent from './components/modal-discard-page.vue'
44
import modalMovePageComponent from './components/modal-move-page.vue'
NGPixel's avatar
NGPixel committed
45
import modalProfile2faComponent from './components/modal-profile-2fa.vue'
46
import modalUpgradeSystemComponent from './components/modal-upgrade-system.vue'
47
import pageLoaderComponent from './components/page-loader.vue'
48
import searchComponent from './components/search.vue'
49
import toggleComponent from './components/toggle.vue'
50
import treeComponent from './components/tree.vue'
51

52
import adminEditUserComponent from './pages/admin-edit-user.component.js'
53 54
import adminProfileComponent from './pages/admin-profile.component.js'
import adminSettingsComponent from './pages/admin-settings.component.js'
NGPixel's avatar
NGPixel committed
55
import adminThemeComponent from './pages/admin-theme.component.js'
56
import contentViewComponent from './pages/content-view.component.js'
57
import editorComponent from './components/editor.component.js'
58
import sourceViewComponent from './pages/source-view.component.js'
59 60

// ====================================
61
// Initialize Vue Modules
62 63
// ====================================

64
Vue.use(VueResource)
65
Vue.use(VueClipboards)
66
Vue.use(VueI18Next)
67
Vue.use(VueLodash, _)
68
Vue.use(helpers)
69

NGPixel's avatar
NGPixel committed
70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
// ====================================
// Register Vue Components
// ====================================

Vue.component('alert', alertComponent)
Vue.component('adminEditUser', adminEditUserComponent)
Vue.component('adminProfile', adminProfileComponent)
Vue.component('adminSettings', adminSettingsComponent)
Vue.component('adminTheme', adminThemeComponent)
Vue.component('anchor', anchorComponent)
Vue.component('colorPicker', colorPickerComponent)
Vue.component('contentView', contentViewComponent)
Vue.component('editor', editorComponent)
Vue.component('editorCodeblock', editorCodeblockComponent)
Vue.component('editorFile', editorFileComponent)
Vue.component('editorVideo', editorVideoComponent)
Vue.component('history', historyComponent)
Vue.component('loadingSpinner', loadingSpinnerComponent)
Vue.component('modalCreatePage', modalCreatePageComponent)
Vue.component('modalCreateUser', modalCreateUserComponent)
NGPixel's avatar
NGPixel committed
90
Vue.component('modalDeletePage', modalDeletePageComponent)
NGPixel's avatar
NGPixel committed
91 92 93 94 95 96 97 98 99 100 101 102 103 104 105
Vue.component('modalDeleteUser', modalDeleteUserComponent)
Vue.component('modalDiscardPage', modalDiscardPageComponent)
Vue.component('modalMovePage', modalMovePageComponent)
Vue.component('modalProfile2fa', modalProfile2faComponent)
Vue.component('modalUpgradeSystem', modalUpgradeSystemComponent)
Vue.component('pageLoader', pageLoaderComponent)
Vue.component('search', searchComponent)
Vue.component('sourceView', sourceViewComponent)
Vue.component('toggle', toggleComponent)
Vue.component('tree', treeComponent)

// ====================================
// Load Localization strings
// ====================================

106 107 108 109
i18next
  .use(i18nextXHR)
  .init({
    backend: {
110
      loadPath: siteRoot + '/js/i18n/{{lng}}.json'
111 112 113 114 115
    },
    lng: siteLang,
    fallbackLng: siteLang
  })

116
$(() => {
117 118 119
  // ====================================
  // Notifications
  // ====================================
120

121
  $(window).bind('beforeunload', () => {
122
    store.dispatch('startLoading')
123 124
  })
  $(document).ajaxSend(() => {
125
    store.dispatch('startLoading')
126
  }).ajaxComplete(() => {
127
    store.dispatch('stopLoading')
128
  })
NGPixel's avatar
NGPixel committed
129

130 131 132
  // ====================================
  // Establish WebSocket connection
  // ====================================
133

134 135
  let socket = io(window.location.origin)
  window.socket = socket
136

137 138 139 140 141
  // ====================================
  // Bootstrap Vue
  // ====================================

  const i18n = new VueI18Next(i18next)
142
  window.wikijs = new Vue({
143
    mixins: [helpers],
NGPixel's avatar
NGPixel committed
144
    components: {},
145 146
    store,
    i18n,
147
    el: '#root',
148 149 150 151 152 153 154
    methods: {
      changeTheme(opts) {
        this.$el.className = `has-stickynav is-primary-${opts.primary} is-alternate-${opts.alt}`
        this.$refs.header.className = `nav is-${opts.primary}`
        this.$refs.footer.className = `footer is-${opts.footer}`
      }
    },
155
    mounted() {
156
      $('a:not(.toc-anchor)').smoothScroll({ speed: 500, offset: -50 })
157 158 159
      $('#header').sticky({ topSpacing: 0 })
      $('.sidebar-pagecontents').sticky({ topSpacing: 15, bottomSpacing: 75 })
    }
160
  })
161
})