浏览代码

Formatted Account pages + fixed search UI

NGPixel 8 年之前
父节点
当前提交
2227515b26

+ 5 - 2
agent.js

@@ -6,9 +6,12 @@
 
 
 global.PROCNAME = 'AGENT';
 global.PROCNAME = 'AGENT';
 global.ROOTPATH = __dirname;
 global.ROOTPATH = __dirname;
-global.CORE_PATH = ROOTPATH + './node_modules/requarks-core/';
-//global.CORE_PATH = ROOTPATH + '/../core/';
 global.IS_DEBUG = process.env.NODE_ENV === 'development';
 global.IS_DEBUG = process.env.NODE_ENV === 'development';
+if(IS_DEBUG) {
+  global.CORE_PATH = ROOTPATH + '/../core/';
+} else {
+  global.CORE_PATH = ROOTPATH + './node_modules/requarks-core/';
+}
 
 
 // ----------------------------------------
 // ----------------------------------------
 // Load Winston
 // Load Winston

文件差异内容过多而无法显示
+ 0 - 0
assets/css/app.css


文件差异内容过多而无法显示
+ 0 - 0
assets/css/login.css


文件差异内容过多而无法显示
+ 0 - 0
assets/js/libs.js


+ 6 - 1
client/scss/app.scss

@@ -1,3 +1,6 @@
+
+$primary: 'indigo';
+
 @import 'core-client/scss/core';
 @import 'core-client/scss/core';
 @import 'core-client/scss/components/alert';
 @import 'core-client/scss/components/alert';
 @import 'core-client/scss/components/button';
 @import 'core-client/scss/components/button';
@@ -8,13 +11,15 @@
 @import 'core-client/scss/components/markdown-content';
 @import 'core-client/scss/components/markdown-content';
 @import 'core-client/scss/components/modal';
 @import 'core-client/scss/components/modal';
 @import 'core-client/scss/components/nav';
 @import 'core-client/scss/components/nav';
+@import 'core-client/scss/components/panel';
+@import 'core-client/scss/components/search';
 @import 'core-client/scss/components/sidebar';
 @import 'core-client/scss/components/sidebar';
 @import 'core-client/scss/components/typography';
 @import 'core-client/scss/components/typography';
 
 
 @import './libs/twemoji-awesome';
 @import './libs/twemoji-awesome';
 @import './libs/jquery-contextmenu';
 @import './libs/jquery-contextmenu';
 
 
-//@import './components/_editor';
+@import './components/_editor';
 
 
 @import './layout/_header';
 @import './layout/_header';
 //@import './layout/_content';
 //@import './layout/_content';

+ 11 - 11
client/scss/components/_editor.scss

@@ -1,13 +1,13 @@
 
 
 .editor-toolbar {
 .editor-toolbar {
 	z-index: 2;
 	z-index: 2;
-	background-color: rgba(0,0,0,0.65);
+	background-color: rgba(0,0,0,0.75);
 	border: none;
 	border: none;
 	border-top-left-radius: 0;
 	border-top-left-radius: 0;
 	border-top-right-radius: 0;
 	border-top-right-radius: 0;
 	opacity: 1;
 	opacity: 1;
 	position: fixed;
 	position: fixed;
-	top: 52px;
+	top: 51px;
 	left: 0;
 	left: 0;
 	width: 100%;
 	width: 100%;
 
 
@@ -44,7 +44,7 @@
 
 
 	span {
 	span {
 		font-size: 12px;
 		font-size: 12px;
-		color: $blue;
+		color: mc('blue', '500');
 	}
 	}
 
 
 	i {
 	i {
@@ -57,7 +57,7 @@
 
 
 		&::before {
 		&::before {
 			content: " ";
 			content: " ";
-			@include spinner($blue,0.5s,24px);
+			@include spinner(mc('blue', '500'),0.5s,24px);
 		}
 		}
 	}
 	}
 
 
@@ -143,11 +143,11 @@
 		}
 		}
 
 
 		&.is-active {
 		&.is-active {
-			background-color: $primary;
+			background-color: mc($primary, '500');
 			color: #FFF;
 			color: #FFF;
 
 
 			> img {
 			> img {
-				border-color: darken($primary, 10%);
+				border-color: darken(mc($primary, '500'), 10%);
 			}
 			}
 
 
 			> span > strong {
 			> span > strong {
@@ -157,11 +157,11 @@
 		}
 		}
 
 
 		&.is-contextopen {
 		&.is-contextopen {
-			background-color: $warning;
+			background-color: mc('orange', '500');
 			color: #FFF;
 			color: #FFF;
 
 
 			> img {
 			> img {
-				border-color: darken($warning, 10%);
+				border-color: darken(mc('orange', '500'), 10%);
 			}
 			}
 
 
 			> span > strong {
 			> span > strong {
@@ -205,7 +205,7 @@
 	border-left: none;
 	border-left: none;
 	border-right: none;
 	border-right: none;
 	padding-top: 52px;
 	padding-top: 52px;
-	font-family: $family-monospace;
+	font-family: $core-font-monospace;
 }
 }
 
 
 .CodeMirror .CodeMirror-code .cm-url {
 .CodeMirror .CodeMirror-code .cm-url {
@@ -256,7 +256,7 @@
 	top: 100px;
 	top: 100px;
 	width: 100%;
 	width: 100%;
 	background-color: rgba(255,255,255,0.95);
 	background-color: rgba(255,255,255,0.95);
-	border-bottom: 1px solid $grey-light;
+	border-bottom: 1px solid mc('grey', '500');
 	z-index: 6;
 	z-index: 6;
 	padding: 20px;
 	padding: 20px;
 	border-bottom: 1px solid #CCC;
 	border-bottom: 1px solid #CCC;
@@ -264,7 +264,7 @@
 	display: none;
 	display: none;
 
 
 	> h3, .column > h3 {
 	> h3, .column > h3 {
-		color: $grey-dark;
+		color: mc('grey', '700');
 		font-size: 24px;
 		font-size: 24px;
 		font-weight: 300;
 		font-weight: 300;
 	}
 	}

+ 0 - 15
client/scss/layout/_header.scss

@@ -33,19 +33,4 @@
 #search-input {
 #search-input {
 	max-width: 300px;
 	max-width: 300px;
 	width: 33vw;
 	width: 33vw;
-}
-
-.searchresults {
-	position: fixed;
-	top: 45px;
-	left: 0;
-	right: 0;
-	margin: 0 auto;
-	width: 500px;
-	z-index: 1;
-
-	&.slideInDown {
-		@include prefix(animation-duration, .6s);
-	}
-
 }
 }

+ 16 - 4
gulpfile.js

@@ -12,6 +12,8 @@ var gzip = require('gulp-gzip');
 var sass = require('gulp-sass');
 var sass = require('gulp-sass');
 var cleanCSS = require('gulp-clean-css');
 var cleanCSS = require('gulp-clean-css');
 var include = require("gulp-include");
 var include = require("gulp-include");
+var run = require('run-sequence');
+var _ = require('lodash');
 
 
 /**
 /**
  * Paths
  * Paths
@@ -57,8 +59,7 @@ var paths = {
 			'./client/scss/*.scss'
 			'./client/scss/*.scss'
 		],
 		],
 		includes: [
 		includes: [
-			//'../core',
-			'./node_modules/requarks-core'
+			'./node_modules/requarks-core' //! MUST BE LAST
 		],
 		],
 		watch: [
 		watch: [
 			'./client/scss/**/*.scss',
 			'./client/scss/**/*.scss',
@@ -68,8 +69,7 @@ var paths = {
 	fonts: [
 	fonts: [
 		'./node_modules/font-awesome/fonts/*-webfont.*',
 		'./node_modules/font-awesome/fonts/*-webfont.*',
 		'!./node_modules/font-awesome/fonts/*-webfont.svg',
 		'!./node_modules/font-awesome/fonts/*-webfont.svg',
-		'../node_modules/requarks-core/core-client/fonts/**/*'
-		//'../core/core-client/fonts/**/*'
+		'../node_modules/requarks-core/core-client/fonts/**/*' //! MUST BE LAST
 	],
 	],
 	deploy: [
 	deploy: [
 		'./**/*',
 		'./**/*',
@@ -189,6 +189,18 @@ gulp.task('watch', function() {
  */
  */
 gulp.task('default', ['watch', 'server']);
 gulp.task('default', ['watch', 'server']);
 
 
+gulp.task('dev', function() {
+
+	paths.css.includes.pop();
+	paths.css.includes.push('../core');
+
+	paths.fonts.pop();
+	paths.fonts.push('../core/core-client/fonts/**/*');
+
+	return run('default');
+
+})
+
 /**
 /**
  * TASK - Creates deployment packages
  * TASK - Creates deployment packages
  */
  */

+ 20 - 18
package.json

@@ -5,7 +5,7 @@
   "main": "server.js",
   "main": "server.js",
   "scripts": {
   "scripts": {
     "start": "node server",
     "start": "node server",
-    "dev": "gulp",
+    "dev": "gulp dev",
     "test": "snyk test && istanbul cover ./node_modules/mocha/bin/_mocha --report lcovonly -- -R spec ./tests/index.js && cat ./coverage/lcov.info | ./node_modules/.bin/codacy-coverage && rm -rf ./coverage",
     "test": "snyk test && istanbul cover ./node_modules/mocha/bin/_mocha --report lcovonly -- -R spec ./tests/index.js && cat ./coverage/lcov.info | ./node_modules/.bin/codacy-coverage && rm -rf ./coverage",
     "snyk-protect": "snyk protect",
     "snyk-protect": "snyk protect",
     "__prepublish": "npm run snyk-protect"
     "__prepublish": "npm run snyk-protect"
@@ -53,24 +53,24 @@
     "filesize.js": "^1.0.2",
     "filesize.js": "^1.0.2",
     "fs-extra": "^0.30.0",
     "fs-extra": "^0.30.0",
     "git-wrapper2-promise": "^0.2.9",
     "git-wrapper2-promise": "^0.2.9",
-    "highlight.js": "^9.7.0",
-    "i18next": "^3.4.3",
+    "highlight.js": "^9.8.0",
+    "i18next": "^3.5.2",
     "i18next-express-middleware": "^1.0.2",
     "i18next-express-middleware": "^1.0.2",
-    "i18next-node-fs-backend": "^0.1.2",
-    "js-yaml": "^3.6.1",
-    "lodash": "^4.16.5",
-    "markdown-it": "^8.0.0",
+    "i18next-node-fs-backend": "^0.1.3",
+    "js-yaml": "^3.7.0",
+    "lodash": "^4.17.2",
+    "markdown-it": "^8.1.0",
     "markdown-it-abbr": "^1.0.4",
     "markdown-it-abbr": "^1.0.4",
-    "markdown-it-anchor": "^2.5.0",
+    "markdown-it-anchor": "^2.5.1",
     "markdown-it-attrs": "^0.8.0",
     "markdown-it-attrs": "^0.8.0",
     "markdown-it-emoji": "^1.3.0",
     "markdown-it-emoji": "^1.3.0",
     "markdown-it-expand-tabs": "^1.0.11",
     "markdown-it-expand-tabs": "^1.0.11",
     "markdown-it-external-links": "0.0.6",
     "markdown-it-external-links": "0.0.6",
     "markdown-it-footnote": "^3.0.1",
     "markdown-it-footnote": "^3.0.1",
     "markdown-it-task-lists": "^1.4.1",
     "markdown-it-task-lists": "^1.4.1",
-    "moment": "^2.15.1",
-    "moment-timezone": "^0.5.6",
-    "mongoose": "^4.6.3",
+    "moment": "^2.17.0",
+    "moment-timezone": "^0.5.9",
+    "mongoose": "^4.6.8",
     "multer": "^1.2.0",
     "multer": "^1.2.0",
     "passport": "^0.3.2",
     "passport": "^0.3.2",
     "passport-facebook": "^2.1.1",
     "passport-facebook": "^2.1.1",
@@ -82,17 +82,17 @@
     "read-chunk": "^2.0.0",
     "read-chunk": "^2.0.0",
     "remove-markdown": "^0.1.0",
     "remove-markdown": "^0.1.0",
     "requarks-core": "github:requarks/core",
     "requarks-core": "github:requarks/core",
-    "request": "^2.75.0",
+    "request": "^2.79.0",
     "search-index": "^0.9.6",
     "search-index": "^0.9.6",
-    "serve-favicon": "^2.3.0",
+    "serve-favicon": "^2.3.2",
     "sharp": "^0.16.1",
     "sharp": "^0.16.1",
     "simplemde": "^1.11.2",
     "simplemde": "^1.11.2",
     "snyk": "^1.19.1",
     "snyk": "^1.19.1",
-    "socket.io": "^1.5.0",
+    "socket.io": "^1.6.0",
     "sticky-js": "^1.0.7",
     "sticky-js": "^1.0.7",
     "validator": "^6.0.0",
     "validator": "^6.0.0",
     "validator-as-promised": "^1.0.2",
     "validator-as-promised": "^1.0.2",
-    "winston": "^2.2.0"
+    "winston": "^2.3.0"
   },
   },
   "devDependencies": {
   "devDependencies": {
     "ace-builds": "^1.2.5",
     "ace-builds": "^1.2.5",
@@ -105,7 +105,7 @@
     "gulp": "^3.9.1",
     "gulp": "^3.9.1",
     "gulp-babel": "^6.1.2",
     "gulp-babel": "^6.1.2",
     "gulp-clean-css": "^2.0.13",
     "gulp-clean-css": "^2.0.13",
-    "gulp-concat": "^2.6.0",
+    "gulp-concat": "^2.6.1",
     "gulp-gzip": "^1.4.0",
     "gulp-gzip": "^1.4.0",
     "gulp-include": "^2.3.1",
     "gulp-include": "^2.3.1",
     "gulp-nodemon": "^2.2.1",
     "gulp-nodemon": "^2.2.1",
@@ -124,9 +124,11 @@
     "mocha": "^3.1.2",
     "mocha": "^3.1.2",
     "mocha-lcov-reporter": "^1.2.0",
     "mocha-lcov-reporter": "^1.2.0",
     "nodemon": "^1.11.0",
     "nodemon": "^1.11.0",
-    "sticky-js": "^1.1.4",
+    "run-sequence": "^1.2.2",
+    "snyk": "^1.20.0",
+    "sticky-js": "^1.1.5",
     "twemoji-awesome": "^1.0.4",
     "twemoji-awesome": "^1.0.4",
-    "vue": "^2.0.3"
+    "vue": "^2.1.0"
   },
   },
   "snyk": true
   "snyk": true
 }
 }

+ 5 - 2
server.js

@@ -7,9 +7,12 @@
 
 
 global.PROCNAME = 'SERVER';
 global.PROCNAME = 'SERVER';
 global.ROOTPATH = __dirname;
 global.ROOTPATH = __dirname;
-global.CORE_PATH = ROOTPATH + './node_modules/requarks-core/';
-//global.CORE_PATH = ROOTPATH + '/../core/';
 global.IS_DEBUG = process.env.NODE_ENV === 'development';
 global.IS_DEBUG = process.env.NODE_ENV === 'development';
+if(IS_DEBUG) {
+  global.CORE_PATH = ROOTPATH + '/../core/';
+} else {
+  global.CORE_PATH = ROOTPATH + './node_modules/requarks-core/';
+}
 
 
 // ----------------------------------------
 // ----------------------------------------
 // Load Winston
 // Load Winston

+ 10 - 13
views/common/header.pug

@@ -24,18 +24,15 @@
 
 
 	transition(name="searchresults-anim", enter-active-class="slideInDown", leave-active-class="fadeOutUp")
 	transition(name="searchresults-anim", enter-active-class="slideInDown", leave-active-class="fadeOutUp")
 		.searchresults.animated(v-show='searchactive', v-cloak, style={'display':'none'})
 		.searchresults.animated(v-show='searchactive', v-cloak, style={'display':'none'})
-			.menu
-				p.menu-label
-					| Search Results
-				ul.menu-list
-					li(v-if="searchres.length === 0")
-						a: em No results matching your query
-					li(v-for='sres in searchres')
-						a(v-bind:href="'/' + sres._id", v-bind:class="{ 'is-active': searchmovekey === 'res.' + sres._id }") {{ sres.title }}
-				p.menu-label(v-if='searchsuggest.length > 0')
-					| Did you mean...?
-				ul.menu-list(v-if='searchsuggest.length > 0')
-					li(v-for='sug in searchsuggest')
-						a(v-on:click="useSuggestion(sug)", v-bind:class="{ 'is-active': searchmovekey === 'sug.' + sug }") {{ sug }}
+			p.searchresults-label Search Results
+			ul.searchresults-list
+				li(v-if="searchres.length === 0")
+					a: em No results matching your query
+				li(v-for='sres in searchres', v-bind:class="{ 'is-active': searchmovekey === 'res.' + sres._id }")
+					a(v-bind:href="'/' + sres._id") {{ sres.title }}
+			p.searchresults-label(v-if='searchsuggest.length > 0') Did you mean...?
+			ul.searchresults-list(v-if='searchsuggest.length > 0')
+				li(v-for='sug in searchsuggest', v-bind:class="{ 'is-active': searchmovekey === 'sug.' + sug }")
+					a(v-on:click="useSuggestion(sug)") {{ sug }}
 
 
 
 

+ 45 - 17
views/pages/admin/_layout.pug

@@ -1,30 +1,58 @@
 extends ../../layout.pug
 extends ../../layout.pug
 
 
 block rootNavCenter
 block rootNavCenter
-
+	h2.nav-item Account
 
 
 block rootNavRight
 block rootNavRight
 	i.nav-item#notifload
 	i.nav-item#notifload
 	.nav-item
 	.nav-item
 		a.button.btn-edit-discard(href='/')
 		a.button.btn-edit-discard(href='/')
-			span.icon
-				i.fa.fa-home
+			i.fa.fa-home
 			span Home
 			span Home
 
 
 block content
 block content
 
 
 	#page-type-account
 	#page-type-account
-		section.hero.is-dark
-			.hero-body
-				.container
-					h1.title Account
-					h2.subtitle Manage your settings and site configuration
-		nav.nav.has-shadow
-			.container
-				.nav-left
-					a.nav-item.is-tab(href='/admin/profile', class={'is-active': adminTab === 'profile'}) My Profile
-					a.nav-item.is-tab(href='/admin/stats', class={'is-active': adminTab === 'stats'}) Stats
-					a.nav-item.is-tab(href='/admin/users', class={'is-active': adminTab === 'users'}) Users
-					a.nav-item.is-tab(href='/admin/settings', class={'is-active': adminTab === 'settings'}) Site Settings
-					a.nav-item.is-tab(href='/logout') Logout
-		block adminContent
+		.container.is-fluid
+			.columns.is-gapless
+
+				.column.is-narrow.is-hidden-touch.sidebar
+
+					aside
+						.sidebar-label
+							i.icon-th-small
+							span Navigation
+						ul.sidebar-menu
+							li
+								a(href='/')
+									i.icon-home
+									span Home
+
+					aside
+						.sidebar-label
+							i.icon-head
+							span Account
+						ul.sidebar-menu
+							li
+								a(href='/admin/profile')
+									i.icon-user
+									span My Profile
+							li
+								a(href='/admin/stats')
+									i.icon-bar-graph-2
+									span Stats
+							li
+								a(href='/admin/users')
+									i.icon-users
+									span Users
+							li
+								a(href='/admin/settings')
+									i.icon-cog
+									span Site Settings
+							li
+								a(href='/logout')
+									i.icon-delete2
+									span Logout
+
+				.column
+					block adminContent

+ 23 - 21
views/pages/admin/profile.pug

@@ -1,28 +1,35 @@
 extends ./_layout.pug
 extends ./_layout.pug
 
 
 block adminContent
 block adminContent
-	section.section
-		.container
-			.columns
-				.column.is-two-thirds
+	.hero
+		h1.title#title My Profile
+		h2.subtitle Profile and authentication info
+	.form-sections
+		.columns.is-gapless
+			.column.is-two-thirds
+				section
 					label.label Email
 					label.label Email
-					p.control.has-icon.has-icon-right
-						input.input(type='email', placeholder='Email', value=user.email, disabled=(user.provider !== 'local'))
-						i.fa.fa-envelope
-					if user.provider == 'local'
+					p.control.is-fullwidth
+						input.input(type='text', placeholder='Email', value=user.email, disabled=(user.provider !== 'local'))
+				if user.provider == 'local'
+					section
 						label.label Password
 						label.label Password
-						p.control.has-icon.has-icon-right
+						p.control.is-fullwidth
 							input.input(type='password', placeholder='Password', value='********')
 							input.input(type='password', placeholder='Password', value='********')
-							i.fa.fa-lock
+					section
 						label.label Verify Password
 						label.label Verify Password
-						p.control.has-icon.has-icon-right
+						p.control.is-fullwidth
 							input.input(type='password', placeholder='Password', value='********')
 							input.input(type='password', placeholder='Password', value='********')
-							i.fa.fa-lock
+				section
 					label.label Display Name
 					label.label Display Name
-					p.control.has-icon.has-icon-right
+					p.control.is-fullwidth
 						input.input(type='text', placeholder='John Smith', value=user.name)
 						input.input(type='text', placeholder='John Smith', value=user.name)
-						i.fa.fa-user
-				.column
+				section
+					button.button.is-green
+						i.icon-check
+						span Save Changes
+			.column
+				.panel
 					label.label Provider
 					label.label Provider
 					p.control.account-profile-provider
 					p.control.account-profile-provider
 						case user.provider
 						case user.provider
@@ -35,9 +42,4 @@ block adminContent
 					label.label Member since
 					label.label Member since
 					p.control= userMoment(user.createdAt).format('LL')
 					p.control= userMoment(user.createdAt).format('LL')
 					label.label Last Profile Update
 					label.label Last Profile Update
-					p.control= userMoment(user.updatedAt).format('LL')
-	section.section
-		.container
-			p.control
-				button.button.is-success
-					| Save Changes
+					p.control= userMoment(user.updatedAt).format('LL')

+ 6 - 3
views/pages/admin/settings.pug

@@ -1,6 +1,9 @@
 extends ./_layout.pug
 extends ./_layout.pug
 
 
 block adminContent
 block adminContent
-	section.section
-		.container
-			label.label Coming soon
+	.hero
+		h1.title#title Site Settings
+		h2.subtitle Manage site configuration
+	.form-sections
+		section
+			| Coming soon

+ 11 - 8
views/pages/admin/stats.pug

@@ -1,11 +1,14 @@
 extends ./_layout.pug
 extends ./_layout.pug
 
 
 block adminContent
 block adminContent
-	section.section
-		.container
-			label.label Entries
-			p.control= totalEntries
-			label.label Uploads
-			p.control= totalUploads
-			label.label Users
-			p.control= totalUsers
+	.hero
+		h1.title#title Stats
+		h2.subtitle General site-wide statistics
+	.form-sections
+		section
+				label.label Entries
+				p.control= totalEntries
+				label.label Uploads
+				p.control= totalUploads
+				label.label Users
+				p.control= totalUsers

+ 15 - 12
views/pages/admin/users.pug

@@ -1,15 +1,18 @@
 extends ./_layout.pug
 extends ./_layout.pug
 
 
 block adminContent
 block adminContent
-	section.section
-		.container
-			.columns
-				.column.is-three-quarters
-					label.label Coming soon
-				.column
-					p.control
-						button.button.is-info
-							| Create Local User
-					p.control
-						button.button.is-info
-							| Authorize Social User
+	.hero
+		h1.title#title Users
+		h2.subtitle Manage users and rights
+		ul.hero-menu
+				li
+					a.is-blue(href='/')
+						i.icon-plus
+						span Create Local User
+				li
+					a.is-indigo(href='/')
+						i.icon-globe
+						span Authorize Social User
+	.form-sections
+		section
+			| Coming soon

+ 4 - 6
views/pages/create.pug

@@ -6,13 +6,11 @@ block rootNavCenter
 block rootNavRight
 block rootNavRight
 	i.nav-item#notifload
 	i.nav-item#notifload
 	span.nav-item
 	span.nav-item
-		a.button.is-warning.btn-create-discard
-			span.icon
-				i.fa.fa-times
+		a.button.is-outlined.btn-create-discard
+			i.icon-cross
 			span Discard
 			span Discard
-		a.button.is-success.btn-create-save
-			span.icon
-				i.fa.fa-check
+		a.button.btn-create-save
+			i.icon-check
 			span Save Document
 			span Save Document
 
 
 block content
 block content

+ 6 - 4
views/pages/source.pug

@@ -5,11 +5,13 @@ block rootNavCenter
 
 
 block rootNavRight
 block rootNavRight
 	i.nav-item#notifload
 	i.nav-item#notifload
-	a.nav-item.btn-move-prompt.is-hidden
-		| Move
-	a.nav-item(href='/' + pageData.meta.path)
-		| Normal View
 	span.nav-item
 	span.nav-item
+		a.button.is-outlined.btn-move-prompt.is-hidden
+			i.icon-shuffle
+			span Move
+		a.button.is-outlined(href='/' + pageData.meta.path)
+			i.icon-loader
+			span Normal View
 		a.button.is-orange(href='/edit/' + pageData.meta.path)
 		a.button.is-orange(href='/edit/' + pageData.meta.path)
 			i.fa.fa-edit
 			i.fa.fa-edit
 			span Edit
 			span Edit

部分文件因为文件数量过多而无法显示