app.js 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. 'use strict'
  2. /* global $, siteRoot */
  3. /* eslint-disable no-new */
  4. import Vue from 'vue'
  5. import VueResource from 'vue-resource'
  6. import VueClipboards from 'vue-clipboards'
  7. import VueLodash from 'vue-lodash'
  8. import store from './store'
  9. import io from 'socket-io-client'
  10. import i18next from 'i18next'
  11. import i18nextXHR from 'i18next-xhr-backend'
  12. import VueI18Next from '@panter/vue-i18next'
  13. import 'jquery-contextmenu'
  14. import 'jquery-simple-upload'
  15. import 'jquery-smooth-scroll'
  16. import 'jquery-sticky'
  17. // ====================================
  18. // Load minimal lodash
  19. // ====================================
  20. import cloneDeep from 'lodash/cloneDeep'
  21. import concat from 'lodash/concat'
  22. import debounce from 'lodash/debounce'
  23. import deburr from 'lodash/deburr'
  24. import delay from 'lodash/delay'
  25. import filter from 'lodash/filter'
  26. import find from 'lodash/find'
  27. import findKey from 'lodash/findKey'
  28. import forEach from 'lodash/forEach'
  29. import includes from 'lodash/includes'
  30. import isBoolean from 'lodash/isBoolean'
  31. import isEmpty from 'lodash/isEmpty'
  32. import isNil from 'lodash/isNil'
  33. import join from 'lodash/join'
  34. import kebabCase from 'lodash/kebabCase'
  35. import last from 'lodash/last'
  36. import map from 'lodash/map'
  37. import nth from 'lodash/nth'
  38. import pullAt from 'lodash/pullAt'
  39. import reject from 'lodash/reject'
  40. import slice from 'lodash/slice'
  41. import split from 'lodash/split'
  42. import startCase from 'lodash/startCase'
  43. import toString from 'lodash/toString'
  44. import toUpper from 'lodash/toUpper'
  45. import trim from 'lodash/trim'
  46. // ====================================
  47. // Load Helpers
  48. // ====================================
  49. import helpers from './helpers'
  50. // ====================================
  51. // Load Vue Components
  52. // ====================================
  53. import alertComponent from './components/alert.vue'
  54. import anchorComponent from './components/anchor.vue'
  55. import colorPickerComponent from './components/color-picker.vue'
  56. import editorCodeblockComponent from './components/editor-codeblock.vue'
  57. import editorFileComponent from './components/editor-file.vue'
  58. import editorVideoComponent from './components/editor-video.vue'
  59. import historyComponent from './components/history.vue'
  60. import loadingSpinnerComponent from './components/loading-spinner.vue'
  61. import modalCreatePageComponent from './components/modal-create-page.vue'
  62. import modalCreateUserComponent from './components/modal-create-user.vue'
  63. import modalDeleteUserComponent from './components/modal-delete-user.vue'
  64. import modalDiscardPageComponent from './components/modal-discard-page.vue'
  65. import modalMovePageComponent from './components/modal-move-page.vue'
  66. import modalProfile2faComponent from './components/modal-profile-2fa.vue'
  67. import modalUpgradeSystemComponent from './components/modal-upgrade-system.vue'
  68. import pageLoaderComponent from './components/page-loader.vue'
  69. import searchComponent from './components/search.vue'
  70. import treeComponent from './components/tree.vue'
  71. import adminEditUserComponent from './pages/admin-edit-user.component.js'
  72. import adminProfileComponent from './pages/admin-profile.component.js'
  73. import adminSettingsComponent from './pages/admin-settings.component.js'
  74. import contentViewComponent from './pages/content-view.component.js'
  75. import editorComponent from './components/editor.component.js'
  76. import sourceViewComponent from './pages/source-view.component.js'
  77. // ====================================
  78. // Build lodash object
  79. // ====================================
  80. const _ = {
  81. deburr,
  82. concat,
  83. cloneDeep,
  84. debounce,
  85. delay,
  86. filter,
  87. find,
  88. findKey,
  89. forEach,
  90. includes,
  91. isBoolean,
  92. isEmpty,
  93. isNil,
  94. join,
  95. kebabCase,
  96. last,
  97. map,
  98. nth,
  99. pullAt,
  100. reject,
  101. slice,
  102. split,
  103. startCase,
  104. toString,
  105. toUpper,
  106. trim
  107. }
  108. // ====================================
  109. // Initialize Vue Modules
  110. // ====================================
  111. Vue.use(VueResource)
  112. Vue.use(VueClipboards)
  113. Vue.use(VueI18Next)
  114. Vue.use(VueLodash, _)
  115. Vue.use(helpers)
  116. i18next
  117. .use(i18nextXHR)
  118. .init({
  119. backend: {
  120. loadPath: siteRoot + '/js/i18n/{{lng}}.json'
  121. },
  122. lng: siteLang,
  123. fallbackLng: siteLang
  124. })
  125. $(() => {
  126. // ====================================
  127. // Notifications
  128. // ====================================
  129. $(window).bind('beforeunload', () => {
  130. store.dispatch('startLoading')
  131. })
  132. $(document).ajaxSend(() => {
  133. store.dispatch('startLoading')
  134. }).ajaxComplete(() => {
  135. store.dispatch('stopLoading')
  136. })
  137. // ====================================
  138. // Establish WebSocket connection
  139. // ====================================
  140. let socket = io(window.location.origin)
  141. window.socket = socket
  142. // ====================================
  143. // Bootstrap Vue
  144. // ====================================
  145. const i18n = new VueI18Next(i18next)
  146. window.wikijs = new Vue({
  147. mixins: [helpers],
  148. components: {
  149. alert: alertComponent,
  150. adminEditUser: adminEditUserComponent,
  151. adminProfile: adminProfileComponent,
  152. adminSettings: adminSettingsComponent,
  153. anchor: anchorComponent,
  154. colorPicker: colorPickerComponent,
  155. contentView: contentViewComponent,
  156. editor: editorComponent,
  157. editorCodeblock: editorCodeblockComponent,
  158. editorFile: editorFileComponent,
  159. editorVideo: editorVideoComponent,
  160. history: historyComponent,
  161. loadingSpinner: loadingSpinnerComponent,
  162. modalCreatePage: modalCreatePageComponent,
  163. modalCreateUser: modalCreateUserComponent,
  164. modalDeleteUser: modalDeleteUserComponent,
  165. modalDiscardPage: modalDiscardPageComponent,
  166. modalMovePage: modalMovePageComponent,
  167. modalProfile2fa: modalProfile2faComponent,
  168. modalUpgradeSystem: modalUpgradeSystemComponent,
  169. pageLoader: pageLoaderComponent,
  170. search: searchComponent,
  171. sourceView: sourceViewComponent,
  172. tree: treeComponent
  173. },
  174. store,
  175. i18n,
  176. el: '#root',
  177. mounted() {
  178. $('a:not(.toc-anchor)').smoothScroll({ speed: 500, offset: -50 })
  179. $('#header').sticky({ topSpacing: 0 })
  180. $('.sidebar-pagecontents').sticky({ topSpacing: 15, bottomSpacing: 75 })
  181. }
  182. })
  183. })