Commit bf6eae14 authored by NGPixel's avatar NGPixel

refactor: All Pages tree Vue component

parent 6814c952
'use strict' 'use strict'
/* global alertsData, siteLang */ /* global siteLang */
/* eslint-disable no-new */ /* eslint-disable no-new */
import $ from 'jquery' import $ from 'jquery'
import _ from 'lodash'
import Vue from 'vue' import Vue from 'vue'
import VueResource from 'vue-resource' import VueResource from 'vue-resource'
import store from './store' import store from './store'
...@@ -12,7 +11,6 @@ import io from 'socket.io-client' ...@@ -12,7 +11,6 @@ import io from 'socket.io-client'
import i18next from 'i18next' import i18next from 'i18next'
import i18nextXHR from 'i18next-xhr-backend' import i18nextXHR from 'i18next-xhr-backend'
import VueI18Next from '@panter/vue-i18next' import VueI18Next from '@panter/vue-i18next'
// import Alerts from './components/alerts.js'
import 'jquery-smooth-scroll' import 'jquery-smooth-scroll'
import 'jquery-sticky' import 'jquery-sticky'
...@@ -25,6 +23,7 @@ import anchorComponent from './components/anchor.vue' ...@@ -25,6 +23,7 @@ import anchorComponent from './components/anchor.vue'
import colorPickerComponent from './components/color-picker.vue' import colorPickerComponent from './components/color-picker.vue'
import loadingSpinnerComponent from './components/loading-spinner.vue' import loadingSpinnerComponent from './components/loading-spinner.vue'
import searchComponent from './components/search.vue' import searchComponent from './components/search.vue'
import treeComponent from './components/tree.vue'
import adminUsersCreateComponent from './modals/admin-users-create.vue' import adminUsersCreateComponent from './modals/admin-users-create.vue'
...@@ -62,14 +61,6 @@ $(() => { ...@@ -62,14 +61,6 @@ $(() => {
store.dispatch('stopLoading') store.dispatch('stopLoading')
}) })
var alerts = {}
/*var alerts = new Alerts()
if (alertsData) {
_.forEach(alertsData, (alertRow) => {
alerts.push(alertRow)
})
}*/
// ==================================== // ====================================
// Establish WebSocket connection // Establish WebSocket connection
// ==================================== // ====================================
...@@ -91,34 +82,16 @@ $(() => { ...@@ -91,34 +82,16 @@ $(() => {
anchor: anchorComponent, anchor: anchorComponent,
colorPicker: colorPickerComponent, colorPicker: colorPickerComponent,
loadingSpinner: loadingSpinnerComponent, loadingSpinner: loadingSpinnerComponent,
search: searchComponent search: searchComponent,
}, tree: treeComponent
directives: {
// sticky: VueSticky
}, },
store, store,
i18n, i18n,
el: '#root', el: '#root',
mounted() { mounted() {
$('a').smoothScroll({ $('a').smoothScroll({ speed: 500, offset: -50 })
speed: 500,
offset: -50
})
$('#header').sticky({ topSpacing: 0 }) $('#header').sticky({ topSpacing: 0 })
$('.sidebar-pagecontents').sticky({ topSpacing: 15, bottomSpacing: 75 }) $('.sidebar-pagecontents').sticky({ topSpacing: 15, bottomSpacing: 75 })
// ====================================
// Pages logic
// ====================================
require('./pages/view.js')(alerts)
require('./pages/all.js')(alerts, socket)
require('./pages/create.js')(alerts, socket)
require('./pages/edit.js')(alerts, socket)
require('./pages/source.js')(alerts)
require('./pages/history.js')(alerts)
require('./pages/admin.js')(alerts)
} }
}) })
}) })
'use strict' <template lang="pug">
transition
ul.collapsable-nav(v-for='treeItem in tree', :class='{ "has-children": treeItem.hasChildren }', v-cloak)
li(v-for='page in treeItem.pages', :class='{ "is-active": page.isActive }')
a(v-on:click='mainAction(page)')
template(v-if='page._id !== "home"')
i(:class='{ "icon-folder2": page.isDirectory, "icon-file-text-o": !page.isDirectory }')
span {{ page.title }}
template(v-else)
i.icon-home
span {{ $t('nav.home') }}
a.is-pagelink(v-if='page.isDirectory && page.isEntry', v-on:click='goto(page._id)')
i.icon-file-text-o
i.icon-arrow-right2
</template>
import $ from 'jquery' <script>
import Vue from 'vue' import * as _ from 'lodash'
import _ from 'lodash'
const rootUrl = '/' export default {
name: '',
module.exports = (alerts, socket) => { data () {
if ($('#page-type-all').length) { return {
let vueAllPages = new Vue({ // eslint-disable-line no-unused-vars
el: '#page-type-all',
data: {
tree: [] tree: []
}, }
methods: { },
fetch: function (basePath) { methods: {
let self = this fetch (basePath) {
$('#notifload').addClass('active') let self = this
Vue.nextTick(() => { self.$store.dispatch('startLoading')
socket.emit('treeFetch', { basePath }, (data) => { self.$nextTick(() => {
if (self.tree.length > 0) { socket.emit('treeFetch', { basePath }, (data) => {
let branch = _.last(self.tree) if (self.tree.length > 0) {
branch.hasChildren = true let branch = _.last(self.tree)
_.find(branch.pages, { _id: basePath }).isActive = true branch.hasChildren = true
} _.find(branch.pages, { _id: basePath }).isActive = true
self.tree.push({
hasChildren: false,
pages: data
})
$('#notifload').removeClass('active')
})
})
},
goto: function (entryPath) {
window.location.assign(rootUrl + entryPath)
},
unfold: function (entryPath) {
let self = this
let lastIndex = 0
_.forEach(self.tree, branch => {
lastIndex++
if (_.find(branch.pages, { _id: entryPath }) !== undefined) {
return false
} }
self.tree.push({
hasChildren: false,
pages: data
})
self.$store.dispatch('stopLoading')
}) })
self.tree = _.slice(self.tree, 0, lastIndex) })
let branch = _.last(self.tree) },
branch.hasChildren = false goto (entryPath) {
branch.pages.forEach(page => { window.location.assign(siteRoot + '/' + entryPath)
page.isActive = false },
}) unfold (entryPath) {
}, let self = this
mainAction: function (page) { let lastIndex = 0
let self = this _.forEach(self.tree, branch => {
if (page.isActive) { lastIndex++
self.unfold(page._id) if (_.find(branch.pages, { _id: entryPath }) !== undefined) {
} else if (page.isDirectory) { return false
self.fetch(page._id)
} else {
self.goto(page._id)
} }
} })
self.tree = _.slice(self.tree, 0, lastIndex)
let branch = _.last(self.tree)
branch.hasChildren = false
branch.pages.forEach(page => {
page.isActive = false
})
}, },
mounted: function () { mainAction (page) {
let basePath = window.location.pathname.slice(0, -4) let self = this
if (basePath.length > 1) { if (page.isActive) {
basePath = basePath.slice(1) self.unfold(page._id)
} else if (page.isDirectory) {
self.fetch(page._id)
} else {
self.goto(page._id)
} }
this.fetch(basePath)
} }
}) },
mounted () {
let basePath = window.location.pathname.slice(0, -4)
if (basePath.length > 1) {
basePath = basePath.slice(1)
}
this.fetch(basePath)
}
} }
} </script>
{ {
"nav": {
"home": "Home"
},
"profile": { "profile": {
"displayname": "Display Name", "displayname": "Display Name",
"displaynameexample": "John Smith", "displaynameexample": "John Smith",
......
...@@ -18,7 +18,9 @@ html ...@@ -18,7 +18,9 @@ html
link(rel='manifest', href='/manifest.json') link(rel='manifest', href='/manifest.json')
//- Site Lang //- Site Lang
script var siteLang = '!{appconfig.lang}'; script.
var siteLang = '!{appconfig.lang}';
var siteRoot = '!{appconfig.host}';
//- JS / CSS //- JS / CSS
script(type='text/javascript', src='/js/libs.min.js') script(type='text/javascript', src='/js/libs.min.js')
......
extends ../layout.pug extends ../layout.pug
block rootNavRight
i.nav-item#notifload
block content block content
.container.is-fluid.has-collapsable-nav
#page-type-all .sidebar.is-collapsed
.container.is-fluid.has-collapsable-nav aside
.sidebar.is-collapsed .sidebar-label
aside span= t('sidebar.nav')
.sidebar-label ul.sidebar-menu
span= t('sidebar.nav') li
ul.sidebar-menu a(href='/')
li
a(href='/')
i.icon-home
span= t('nav.home')
if !isGuest
li
a(href='/admin')
i.icon-head
span= t('nav.account')
else
li
a(href='/login')
i.icon-unlock
span= t('nav.login')
ul.collapsable-nav(v-for='treeItem in tree', :class='{ "has-children": treeItem.hasChildren }', v-cloak)
li(v-for='page in treeItem.pages', :class='{ "is-active": page.isActive }')
a(v-on:click='mainAction(page)')
template(v-if='page._id !== "home"')
i(:class='{ "icon-folder2": page.isDirectory, "icon-file-text-o": !page.isDirectory }')
span {{ page.title }}
template(v-else)
i.icon-home i.icon-home
span= t('nav.home') span= t('nav.home')
a.is-pagelink(v-if='page.isDirectory && page.isEntry', v-on:click='goto(page._id)') if !isGuest
i.icon-file-text-o li
i.icon-arrow-right2 a(href='/admin')
i.icon-cog
span= t('nav.account')
else
li
a(href='/login')
i.icon-unlock
span= t('nav.login')
tree
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment