refactor: updated loggers + admin UI improvements + setup fixes
This commit is contained in:
		| @@ -4,13 +4,13 @@ | ||||
|       .pa-3.pt-4 | ||||
|         .headline.primary--text Authentication | ||||
|         .subheading.grey--text Configure the authentication settings of your wiki | ||||
|       v-tabs(color='grey lighten-4', grow, slider-color='primary', show-arrows) | ||||
|       v-tabs(color='grey lighten-4', fixed-tabs, slider-color='primary', show-arrows) | ||||
|         v-tab(key='settings'): v-icon settings | ||||
|         v-tab(v-for='provider in providers', :key='provider.key') {{ provider.title }} | ||||
|         v-tab(v-for='provider in activeProviders', :key='provider.key') {{ provider.title }} | ||||
|  | ||||
|         v-tab-item(key='settings', :transition='false', :reverse-transition='false') | ||||
|           v-card.pa-3 | ||||
|             .body-2.pb-2 Select which authentication providers are enabled: | ||||
|             .body-2.pb-2 Select which authentication providers to enable: | ||||
|             v-form | ||||
|               v-checkbox( | ||||
|                 v-for='(provider, n) in providers', | ||||
| @@ -32,11 +32,24 @@ | ||||
|               v-btn(icon, @click='refresh') | ||||
|                 v-icon.grey--text refresh | ||||
|  | ||||
|         v-tab-item(v-for='(provider, n) in providers', :key='provider.key', :transition='false', :reverse-transition='false') | ||||
|         v-tab-item(v-for='(provider, n) in activeProviders', :key='provider.key', :transition='false', :reverse-transition='false') | ||||
|           v-card.pa-3 | ||||
|             .body-1(v-if='!provider.props || provider.props.length < 1') This provider has no configuration options you can modify. | ||||
|             v-form(v-else) | ||||
|               v-text-field(v-for='prop in provider.props', :key='prop', :label='prop', prepend-icon='mode_edit') | ||||
|             v-form | ||||
|               v-subheader Provider Configuration | ||||
|               .body-1(v-if='!provider.props || provider.props.length < 1') This provider has no configuration options you can modify. | ||||
|               v-text-field(v-else, v-for='prop in provider.props', :key='prop', :label='prop', prepend-icon='mode_edit') | ||||
|               v-divider | ||||
|               v-subheader Registration | ||||
|               v-switch.ml-3( | ||||
|                 v-model='auths', | ||||
|                 label='Allow self-registration', | ||||
|                 :value='true', | ||||
|                 color='primary', | ||||
|                 hint='Allow any user successfully authorized by the provider to access the wiki.', | ||||
|                 persistent-hint | ||||
|               ) | ||||
|               v-text-field(label='Limit to specific email domains', prepend-icon='mail_outline') | ||||
|               v-text-field(label='Assign to group', prepend-icon='people') | ||||
|               v-divider | ||||
|               v-btn(color='primary') | ||||
|                 v-icon(left) chevron_right | ||||
| @@ -52,6 +65,8 @@ | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| import _ from 'lodash' | ||||
|  | ||||
| /* global CONSTANTS */ | ||||
|  | ||||
| export default { | ||||
| @@ -62,6 +77,11 @@ export default { | ||||
|       refreshCompleted: false | ||||
|     } | ||||
|   }, | ||||
|   computed: { | ||||
|     activeProviders() { | ||||
|       return _.filter(this.providers, 'isEnabled') | ||||
|     } | ||||
|   }, | ||||
|   apollo: { | ||||
|     providers: { | ||||
|       query: CONSTANTS.GRAPH.AUTHENTICATION.QUERY_PROVIDERS, | ||||
|   | ||||
| @@ -7,27 +7,48 @@ | ||||
|         v-form.pt-3 | ||||
|           v-layout(row wrap) | ||||
|             v-flex(lg6 xs12) | ||||
|               v-card | ||||
|                 v-toolbar(color='blue', dark, dense, flat) | ||||
|                   v-toolbar-title | ||||
|                     .subheading Site Info | ||||
|                   v-btn(fab, absolute, right, bottom, small, light): v-icon save | ||||
|                 v-card-text | ||||
|                   v-text-field(label='Site Title', required, :counter='50', v-model='siteTitle') | ||||
|                   v-text-field(label='Site Description', :counter='255') | ||||
|                   v-text-field(label='Site Keywords', :counter='255') | ||||
|                   v-select(label='Meta Robots', chips, tags, :items='metaRobots', v-model='metaRobotsSelection') | ||||
|               v-form | ||||
|                 v-card | ||||
|                   v-toolbar(color='primary', dark, dense, flat) | ||||
|                     v-toolbar-title | ||||
|                       .subheading Site Info | ||||
|                   v-subheader General | ||||
|                   .px-3 | ||||
|                     v-text-field(label='Site Title', required, :counter='50', v-model='siteTitle', prepend-icon='public') | ||||
|                     v-divider | ||||
|                   v-subheader SEO | ||||
|                   .px-3 | ||||
|                     v-text-field(label='Site Description', :counter='255', prepend-icon='public') | ||||
|                     v-text-field(label='Site Keywords', :counter='255', prepend-icon='public') | ||||
|                     v-select(label='Meta Robots', chips, tags, :items='metaRobots', v-model='metaRobotsSelection', prepend-icon='public') | ||||
|                   v-divider | ||||
|                   .px-3.pb-3 | ||||
|                     v-btn(color='primary') Save | ||||
|             v-flex(lg6 xs12) | ||||
|               v-card | ||||
|                 v-toolbar(color='blue', dark, dense, flat) | ||||
|                 v-toolbar(color='primary', dark, dense, flat) | ||||
|                   v-toolbar-title | ||||
|                     .subheading Site Branding | ||||
|                 v-card-text --- | ||||
|               v-card.mt-3 | ||||
|                 v-toolbar(color='primary', dark, dense, flat) | ||||
|                   v-toolbar-title | ||||
|                     .subheading Maintenance Mode | ||||
|                 v-card-text | ||||
|                   .body-1 Maintenance mode restrict access to the site to administrators only, regarless of current permissions. | ||||
|                   v-btn.mt-3(color='orange darken-2', dark) | ||||
|                     icon-home-alert.mr-2(fillColor='#FFFFFF') | ||||
|                     | Turn On Maintenance Mode | ||||
|  | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| import IconHomeAlert from 'mdi/home-alert' | ||||
|  | ||||
| export default { | ||||
|   components: { | ||||
|     IconHomeAlert | ||||
|   }, | ||||
|   data() { | ||||
|     return { | ||||
|       siteTitle: 'Wiki.js', | ||||
|   | ||||
| @@ -8,10 +8,9 @@ | ||||
|           v-layout(row wrap) | ||||
|             v-flex(lg6 xs12) | ||||
|               v-card | ||||
|                 v-toolbar(color='blue', dark, dense, flat) | ||||
|                 v-toolbar(color='primary', dark, dense, flat) | ||||
|                   v-toolbar-title | ||||
|                     .subheading Locale | ||||
|                   v-btn(fab, absolute, right, bottom, small, light): v-icon save | ||||
|                     .subheading Locale Settings | ||||
|                 v-card-text | ||||
|                   v-select(:items='locales', prepend-icon='public', v-model='selectedLocale', label='Site Locale', persistent-hint, hint='All UI text elements will be displayed in selected language.') | ||||
|                     template(slot='item', slot-scope='data') | ||||
| @@ -21,16 +20,19 @@ | ||||
|                         v-list-tile-title(v-html='data.item.text') | ||||
|                         v-list-tile-sub-title(v-html='data.item.original') | ||||
|                   v-divider | ||||
|                   v-switch(v-model='rtlEnabled', label='RTL Text Display', color='primary', persistent-hint, hint='For Right-to-Left languages, e.g. Arabic') | ||||
|                   v-switch(v-model='rtlEnabled', label='RTL Display Mode', color='primary', persistent-hint, hint='For Right-to-Left languages, e.g. Arabic') | ||||
|                 v-divider | ||||
|                 .px-3.pb-3 | ||||
|                   v-btn(color='primary') Save | ||||
|             v-flex(lg6 xs12) | ||||
|               v-card | ||||
|                 v-toolbar(color='blue', dark, dense, flat) | ||||
|                 v-toolbar(color='teal', dark, dense, flat) | ||||
|                   v-toolbar-title | ||||
|                     .subheading Download Locale | ||||
|                 v-list | ||||
|                   v-list-tile(@click='') | ||||
|                     v-list-tile-avatar | ||||
|                       v-avatar.blue.white--text(tile, size='40') ZH | ||||
|                       v-avatar.teal.white--text(tile, size='40') ZH | ||||
|                     v-list-tile-content | ||||
|                       v-list-tile-title Chinese | ||||
|                       v-list-tile-sub-title 中文 | ||||
| @@ -39,7 +41,7 @@ | ||||
|                         v-icon.grey--text cloud_download | ||||
|                   v-list-tile(@click='') | ||||
|                     v-list-tile-avatar | ||||
|                       v-avatar.blue.white--text(tile, size='40') EN | ||||
|                       v-avatar.teal.white--text(tile, size='40') EN | ||||
|                     v-list-tile-content | ||||
|                       v-list-tile-title English | ||||
|                       v-list-tile-sub-title English | ||||
| @@ -47,7 +49,7 @@ | ||||
|                       v-icon.green--text check | ||||
|                   v-list-tile(@click='') | ||||
|                     v-list-tile-avatar | ||||
|                       v-avatar.blue.white--text(tile, size='40') FR | ||||
|                       v-avatar.teal.white--text(tile, size='40') FR | ||||
|                     v-list-tile-content | ||||
|                       v-list-tile-title French | ||||
|                       v-list-tile-sub-title Français | ||||
| @@ -55,7 +57,7 @@ | ||||
|                       v-icon.green--text check | ||||
|                   v-list-tile(@click='') | ||||
|                     v-list-tile-avatar | ||||
|                       v-avatar.blue.white--text(tile, size='40') RU | ||||
|                       v-avatar.teal.white--text(tile, size='40') RU | ||||
|                     v-list-tile-content | ||||
|                       v-list-tile-title Russian | ||||
|                       v-list-tile-sub-title Русский | ||||
|   | ||||
							
								
								
									
										93
									
								
								client/components/admin-logging.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										93
									
								
								client/components/admin-logging.vue
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,93 @@ | ||||
| <template lang='pug'> | ||||
|   v-card(flat) | ||||
|     v-card(color='grey lighten-5') | ||||
|       .pa-3.pt-4 | ||||
|         .headline.primary--text Logging | ||||
|         .subheading.grey--text Configure the system logger(s) | ||||
|       v-tabs(color='grey lighten-4', fixed-tabs, slider-color='primary', show-arrows) | ||||
|         v-tab(key='settings'): v-icon settings | ||||
|         v-tab(v-for='svc in activeServices', :key='svc.key') {{ svc.title }} | ||||
|  | ||||
|         v-tab-item(key='settings', :transition='false', :reverse-transition='false') | ||||
|           v-card.pa-3 | ||||
|             .body-2.pb-2 Select which logging service to enable: | ||||
|             v-form | ||||
|               v-checkbox( | ||||
|                 v-for='(svc, n) in services', | ||||
|                 v-model='selectedServices', | ||||
|                 :key='svc.key', | ||||
|                 :label='svc.title', | ||||
|                 :value='svc.key', | ||||
|                 color='primary', | ||||
|                 :disabled='svc.key === `console`' | ||||
|                 hide-details | ||||
|               ) | ||||
|               v-divider | ||||
|               v-btn(color='primary') | ||||
|                 v-icon(left) chevron_right | ||||
|                 | Set Services | ||||
|               v-btn(color='black', dark) | ||||
|                 v-icon(left) keyboard | ||||
|                 | View Console | ||||
|               v-btn(color='black', dark) | ||||
|                 v-icon(left) layers_clear | ||||
|                 | Purge Logs | ||||
|               v-btn(icon, @click='refresh') | ||||
|                 v-icon.grey--text refresh | ||||
|  | ||||
|         v-tab-item(v-for='(svc, n) in activeServices', :key='svc.key', :transition='false', :reverse-transition='false') | ||||
|           v-card.pa-3 | ||||
|             v-form | ||||
|               v-subheader Service Configuration | ||||
|               .body-1(v-if='!svc.props || svc.props.length < 1') This logging service has no configuration options you can modify. | ||||
|               v-text-field(v-else, v-for='prop in svc.props', :key='prop', :label='prop', prepend-icon='mode_edit') | ||||
|               v-divider | ||||
|               v-btn(color='primary') | ||||
|                 v-icon(left) chevron_right | ||||
|                 | Save Configuration | ||||
|  | ||||
|     v-snackbar( | ||||
|       color='success' | ||||
|       top | ||||
|       v-model='refreshCompleted' | ||||
|     ) | ||||
|       v-icon.mr-3(dark) cached | ||||
|       | List of logging services has been refreshed. | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| import _ from 'lodash' | ||||
|  | ||||
| /* global CONSTANTS */ | ||||
|  | ||||
| export default { | ||||
|   data() { | ||||
|     return { | ||||
|       services: [], | ||||
|       selectedServices: ['console'], | ||||
|       refreshCompleted: false | ||||
|     } | ||||
|   }, | ||||
|   computed: { | ||||
|     activeServices() { | ||||
|       return _.filter(this.services, 'isEnabled') | ||||
|     } | ||||
|   }, | ||||
|   apollo: { | ||||
|     services: { | ||||
|       query: CONSTANTS.GRAPH.AUTHENTICATION.QUERY_PROVIDERS, | ||||
|       update: (data) => data.authentication.providers | ||||
|     } | ||||
|   }, | ||||
|   methods: { | ||||
|     async refresh() { | ||||
|       await this.$apollo.queries.services.refetch() | ||||
|       this.refreshCompleted = true | ||||
|     } | ||||
|   } | ||||
| } | ||||
| </script> | ||||
|  | ||||
| <style lang='scss'> | ||||
|  | ||||
| </style> | ||||
| @@ -4,7 +4,7 @@ | ||||
|       .pa-3.pt-4 | ||||
|         .headline.primary--text Search Engine | ||||
|         .subheading.grey--text Configure the search capabilities of your wiki | ||||
|       v-tabs(color='grey lighten-4', grow, slider-color='primary', show-arrows) | ||||
|       v-tabs(color='grey lighten-4', fixed-tabs, slider-color='primary', show-arrows) | ||||
|         v-tab(key='settings'): v-icon settings | ||||
|         v-tab(key='db') Database | ||||
|         v-tab(key='algolia') Algolia | ||||
|   | ||||
| @@ -4,7 +4,7 @@ | ||||
|       .pa-3.pt-4 | ||||
|         .headline.primary--text Storage | ||||
|         .subheading.grey--text Set backup and sync targets for your content | ||||
|       v-tabs(color='grey lighten-4', grow, slider-color='primary', show-arrows) | ||||
|       v-tabs(color='grey lighten-4', fixed-tabs, slider-color='primary', show-arrows) | ||||
|         v-tab(key='settings'): v-icon settings | ||||
|         v-tab(key='local') Local FS | ||||
|         v-tab(key='git') Git | ||||
| @@ -19,7 +19,15 @@ | ||||
|         v-tab-item(key='settings') | ||||
|           v-card.pa-3 | ||||
|             v-form | ||||
|               v-checkbox(v-for='(target, n) in targets', v-model='auths', :key='n', :label='target.text', :value='target.value', color='primary') | ||||
|               v-checkbox( | ||||
|                 v-for='(target, n) in targets', | ||||
|                 v-model='auths', | ||||
|                 :key='n', | ||||
|                 :label='target.text', | ||||
|                 :value='target.value', | ||||
|                 color='primary', | ||||
|                 hide-details | ||||
|               ) | ||||
|               v-divider | ||||
|               v-btn(color='primary') | ||||
|                 v-icon(left) chevron_right | ||||
| @@ -32,7 +40,7 @@ export default { | ||||
|   data() { | ||||
|     return { | ||||
|       targets: [ | ||||
|         { text: 'Local FS', value: 'local' }, | ||||
|         { text: 'Local Filesystem', value: 'local' }, | ||||
|         { text: 'Git', value: 'auth0' }, | ||||
|         { text: 'Amazon S3', value: 'algolia' }, | ||||
|         { text: 'Azure Blob Storage', value: 'elasticsearch' }, | ||||
|   | ||||
| @@ -8,10 +8,9 @@ | ||||
|           v-layout(row wrap) | ||||
|             v-flex(lg6 xs12) | ||||
|               v-card | ||||
|                 v-toolbar(color='blue', dark, dense, flat) | ||||
|                 v-toolbar(color='primary', dark, dense, flat) | ||||
|                   v-toolbar-title | ||||
|                     .subheading Theme | ||||
|                   v-btn(fab, absolute, right, bottom, small, light): v-icon save | ||||
|                 v-card-text | ||||
|                   v-select(:items='themes', prepend-icon='palette', v-model='selectedTheme', label='Site Theme', persistent-hint, hint='Themes affect how content pages are displayed. Other site sections (such as the editor or admin area) are not affected.') | ||||
|                     template(slot='item', slot-scope='data') | ||||
| @@ -22,12 +21,15 @@ | ||||
|                         v-list-tile-sub-title(v-html='data.item.author') | ||||
|                   v-divider | ||||
|                   v-switch(v-model='darkMode', label='Dark Mode', color='primary', persistent-hint, hint='Not recommended for accessibility') | ||||
|                 v-divider | ||||
|                 .px-3.pb-3 | ||||
|                   v-btn(color='primary') Save | ||||
|             v-flex(lg6 xs12) | ||||
|               v-card | ||||
|                 v-toolbar(color='blue', dark, dense, flat) | ||||
|                 v-toolbar(color='primary', dark, dense, flat) | ||||
|                   v-toolbar-title | ||||
|                     .subheading Theme Options | ||||
|                 v-list | ||||
|                     .subheading --- | ||||
|                 v-card-text --- | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
|   | ||||
| @@ -85,6 +85,7 @@ const router = new VueRouter({ | ||||
|     { path: '/theme', component: () => import(/* webpackChunkName: "admin" */ './admin-theme.vue') }, | ||||
|     { path: '/users', component: () => import(/* webpackChunkName: "admin" */ './admin-users.vue') }, | ||||
|     { path: '/auth', component: () => import(/* webpackChunkName: "admin" */ './admin-auth.vue') }, | ||||
|     { path: '/logging', component: () => import(/* webpackChunkName: "admin" */ './admin-logging.vue') }, | ||||
|     { path: '/search', component: () => import(/* webpackChunkName: "admin" */ './admin-search.vue') }, | ||||
|     { path: '/storage', component: () => import(/* webpackChunkName: "admin" */ './admin-storage.vue') }, | ||||
|     { path: '/api', component: () => import(/* webpackChunkName: "admin" */ './admin-api.vue') }, | ||||
|   | ||||
| @@ -1,13 +1,38 @@ | ||||
| <template lang='pug'> | ||||
|   v-toolbar(color='black', dark, app, clipped-left, fixed, flat) | ||||
|     v-toolbar-side-icon(@click.native='') | ||||
|       v-icon view_module | ||||
|     v-toolbar-title | ||||
|       span.subheading Wiki.js | ||||
|     v-spacer | ||||
|     transition(name='navHeaderSearch') | ||||
|       v-text-field( | ||||
|         ref='searchField', | ||||
|         v-if='searchIsShown', | ||||
|         v-model='search', | ||||
|         clearable, | ||||
|         color='blue', | ||||
|         label='Search...', | ||||
|         single-line, | ||||
|         hide-details, | ||||
|         append-icon='search', | ||||
|         :append-icon-cb='searchEnter', | ||||
|         :loading='searchIsLoading', | ||||
|         @keyup.enter='searchEnter', | ||||
|         @keyup.esc='searchToggle' | ||||
|       ) | ||||
|         v-progress-linear( | ||||
|           indeterminate, | ||||
|           slot='progress', | ||||
|           height='2', | ||||
|           color='blue' | ||||
|         ) | ||||
|     v-spacer | ||||
|     v-progress-circular.mr-3(indeterminate, color='blue', v-show='$apollo.loading') | ||||
|     v-btn(icon) | ||||
|       v-icon(color='grey') search | ||||
|     v-btn(icon, @click.native='darkTheme = !darkTheme') | ||||
|     transition(name='navHeaderSearch') | ||||
|       v-btn(icon, @click='searchToggle', v-if='!searchIsShown') | ||||
|         v-icon(color='grey') search | ||||
|     v-btn(icon, href='/a') | ||||
|       v-icon(color='grey') settings | ||||
|     v-menu(offset-y, min-width='300') | ||||
|       v-btn(icon, slot='activator') | ||||
| @@ -20,7 +45,10 @@ | ||||
|             v-list-tile-title John Doe | ||||
|             v-list-tile-sub-title john.doe@example.com | ||||
|         v-divider.my-0 | ||||
|         v-list-tile(@click='') | ||||
|         v-list-tile(href='/p') | ||||
|           v-list-tile-action: v-icon(color='red') person | ||||
|           v-list-tile-title Profile | ||||
|         v-list-tile(href='/logout') | ||||
|           v-list-tile-action: v-icon(color='red') exit_to_app | ||||
|           v-list-tile-title Logout | ||||
| </template> | ||||
| @@ -28,11 +56,41 @@ | ||||
| <script> | ||||
| export default { | ||||
|   data() { | ||||
|     return {} | ||||
|     return { | ||||
|       searchIsLoading: false, | ||||
|       searchIsShown: false, | ||||
|       search: '' | ||||
|     } | ||||
|   }, | ||||
|   methods: { | ||||
|     searchToggle() { | ||||
|       this.searchIsLoading = false | ||||
|       this.searchIsShown = !this.searchIsShown | ||||
|       if (this.searchIsShown) { | ||||
|         this.$nextTick(() => { | ||||
|           this.$refs.searchField.focus() | ||||
|         }) | ||||
|       } | ||||
|     }, | ||||
|     searchEnter() { | ||||
|       this.searchIsLoading = true | ||||
|     } | ||||
|   } | ||||
| } | ||||
| </script> | ||||
|  | ||||
| <style> | ||||
|  | ||||
| <style lang='scss'> | ||||
| .navHeaderSearch { | ||||
|   &-enter-active, &-leave-active { | ||||
|     transition: opacity .25s ease, transform .25s ease; | ||||
|     opacity: 1; | ||||
|   } | ||||
|   &-enter-active { | ||||
|     transition-delay: .25s; | ||||
|   } | ||||
|   &-enter, &-leave-to { | ||||
|     opacity: 0; | ||||
|     transform: translateY(-25px); | ||||
|   } | ||||
| } | ||||
| </style> | ||||
|   | ||||
| @@ -40,7 +40,7 @@ | ||||
|  | ||||
|           v-stepper-content(step='1') | ||||
|             v-card.text-xs-center.pa-3(flat) | ||||
|               img(src='svg/logo-wikijs.svg', alt='Wiki.js Logo', style='width: 300px;') | ||||
|               img(src='/svg/logo-wikijs.svg', alt='Wiki.js Logo', style='width: 300px;') | ||||
|             v-container | ||||
|               .body-2.py-2 This installation wizard will guide you through the steps needed to get your wiki up and running in no time! | ||||
|               .body-1 | ||||
|   | ||||
		Reference in New Issue
	
	Block a user