wikijs-fork/client/js/app.js

202 lines
7.0 KiB
JavaScript
Raw Normal View History

2017-02-09 01:52:37 +00:00
'use strict'
2017-09-10 05:41:22 +00:00
/* global siteConfig */
2017-03-27 02:07:40 +00:00
import CONSTANTS from './constants'
2017-05-21 03:21:16 +00:00
import Vue from 'vue'
import VueResource from 'vue-resource'
2017-05-22 17:32:52 +00:00
import VueClipboards from 'vue-clipboards'
import VeeValidate from 'vee-validate'
2017-10-28 18:17:14 +00:00
import { ApolloClient } from 'apollo-client'
import { ApolloLink } from 'apollo-link'
import { createApolloFetch } from 'apollo-fetch'
import { BatchHttpLink } from 'apollo-link-batch-http'
2017-10-28 18:17:14 +00:00
import { InMemoryCache } from 'apollo-cache-inmemory'
import store from './store'
2017-12-24 05:34:47 +00:00
// ====================================
// Load Modules
// ====================================
import localization from './modules/localization'
// ====================================
// Load Helpers
// ====================================
import helpers from './helpers'
2017-05-21 03:21:16 +00:00
// ====================================
// Load Vue Components
// ====================================
import alertComponent from './components/alert.vue'
2017-05-21 03:21:16 +00:00
import anchorComponent from './components/anchor.vue'
import colorPickerComponent from './components/color-picker.vue'
import editorCodeblockComponent from './components/editor-codeblock.vue'
import editorFileComponent from './components/editor-file.vue'
import editorVideoComponent from './components/editor-video.vue'
import historyComponent from './components/history.vue'
2017-05-21 03:21:16 +00:00
import loadingSpinnerComponent from './components/loading-spinner.vue'
import loginComponent from './components/login.vue'
import modalCreatePageComponent from './components/modal-create-page.vue'
import modalCreateUserComponent from './components/modal-create-user.vue'
2017-10-10 01:43:43 +00:00
import modalDeletePageComponent from './components/modal-delete-page.vue'
import modalDeleteUserComponent from './components/modal-delete-user.vue'
import modalDiscardPageComponent from './components/modal-discard-page.vue'
import modalMovePageComponent from './components/modal-move-page.vue'
2017-06-12 01:11:01 +00:00
import modalProfile2faComponent from './components/modal-profile-2fa.vue'
import modalUpgradeSystemComponent from './components/modal-upgrade-system.vue'
import navigatorComponent from './components/navigator.vue'
import pageLoaderComponent from './components/page-loader.vue'
2017-05-21 03:21:16 +00:00
import searchComponent from './components/search.vue'
import toggleComponent from './components/toggle.vue'
2017-05-21 22:58:19 +00:00
import treeComponent from './components/tree.vue'
2017-05-21 03:21:16 +00:00
import adminEditUserComponent from './pages/admin-edit-user.component.js'
2017-05-21 03:21:16 +00:00
import adminProfileComponent from './pages/admin-profile.component.js'
import adminSettingsComponent from './pages/admin-settings.component.js'
2017-07-02 02:23:40 +00:00
import adminThemeComponent from './pages/admin-theme.component.js'
import contentViewComponent from './pages/content-view.component.js'
import editorComponent from './components/editor.component.js'
import sourceViewComponent from './pages/source-view.component.js'
2017-05-21 03:21:16 +00:00
// ====================================
// Initialize Global Vars
// ====================================
window.wiki = null
window.CONSTANTS = CONSTANTS
// ====================================
// Initialize Apollo Client (GraphQL)
// ====================================
const graphQLEndpoint = window.location.protocol + '//' + window.location.host + siteConfig.path + 'graphql'
const apolloFetch = createApolloFetch({
uri: graphQLEndpoint,
constructOptions: (requestOrRequests, options) => ({
...options,
method: 'POST',
body: JSON.stringify(requestOrRequests),
credentials: 'include'
})
})
window.graphQL = new ApolloClient({
link: ApolloLink.from([
new ApolloLink((operation, forward) => {
operation.setContext({
headers: {
'Content-Type': 'application/json'
}
})
return forward(operation)
}),
new BatchHttpLink({
fetch: apolloFetch
})
]),
2017-10-28 18:17:14 +00:00
cache: new InMemoryCache(),
connectToDevTools: (process.env.node_env === 'development')
})
2017-05-21 03:21:16 +00:00
// ====================================
// Initialize Vue Modules
2017-05-21 03:21:16 +00:00
// ====================================
Vue.use(VueResource)
2017-05-22 17:32:52 +00:00
Vue.use(VueClipboards)
Vue.use(localization.VueI18Next)
Vue.use(helpers)
Vue.use(VeeValidate, {
enableAutoClasses: true,
classNames: {
touched: 'is-touched', // the control has been blurred
untouched: 'is-untouched', // the control hasn't been blurred
valid: 'is-valid', // model is valid
invalid: 'is-invalid', // model is invalid
pristine: 'is-pristine', // control has not been interacted with
dirty: 'is-dirty' // control has been interacted with
}
})
2017-05-21 03:21:16 +00:00
2017-07-02 02:23:40 +00:00
// ====================================
// 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('login', loginComponent)
2017-07-02 02:23:40 +00:00
Vue.component('modalCreatePage', modalCreatePageComponent)
Vue.component('modalCreateUser', modalCreateUserComponent)
2017-10-10 01:43:43 +00:00
Vue.component('modalDeletePage', modalDeletePageComponent)
2017-07-02 02:23:40 +00:00
Vue.component('modalDeleteUser', modalDeleteUserComponent)
Vue.component('modalDiscardPage', modalDiscardPageComponent)
Vue.component('modalMovePage', modalMovePageComponent)
Vue.component('modalProfile2fa', modalProfile2faComponent)
Vue.component('modalUpgradeSystem', modalUpgradeSystemComponent)
Vue.component('navigator', navigatorComponent)
2017-07-02 02:23:40 +00:00
Vue.component('pageLoader', pageLoaderComponent)
Vue.component('search', searchComponent)
2018-01-28 02:40:51 +00:00
Vue.component('setup', () => import(/* webpackChunkName: "setup" */ './components/setup.component.js'))
2017-07-02 02:23:40 +00:00
Vue.component('sourceView', sourceViewComponent)
Vue.component('toggle', toggleComponent)
Vue.component('tree', treeComponent)
2017-09-10 05:41:22 +00:00
document.addEventListener('DOMContentLoaded', ev => {
// ====================================
// Notifications
// ====================================
2016-08-28 15:27:05 +00:00
2017-09-10 05:41:22 +00:00
window.addEventListener('beforeunload', () => {
store.dispatch('startLoading')
2017-02-09 01:52:37 +00:00
})
2017-05-21 03:21:16 +00:00
// ====================================
// Bootstrap Vue
// ====================================
const i18n = localization.init()
2017-09-10 05:41:22 +00:00
window.wiki = new Vue({
mixins: [helpers],
2017-07-02 02:23:40 +00:00
components: {},
2017-05-21 03:21:16 +00:00
store,
i18n,
el: '#app',
2017-07-02 16:51:39 +00:00
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}`
}
},
mounted() {
2017-09-10 05:41:22 +00:00
}
2017-05-21 03:21:16 +00:00
})
// ====================================
// Load Icons
// ====================================
2018-01-21 22:54:43 +00:00
import(/* webpackChunkName: "icons" */ '../svg/icons.svg').then(icons => {
document.body.insertAdjacentHTML('beforeend', icons)
})
2017-02-09 01:52:37 +00:00
})