fix: UI fixes + search crash (#1086)

This commit is contained in:
NGPixel 2019-11-02 16:04:43 -04:00
parent 57f79c19b2
commit d69dde1df5
9 changed files with 55 additions and 54 deletions

View File

@ -104,7 +104,7 @@
v-list-item(to='/dev-flags') v-list-item(to='/dev-flags')
v-list-item-title {{ $t('admin:dev.flags.title') }} v-list-item-title {{ $t('admin:dev.flags.title') }}
v-list-item(href='/graphql') v-list-item(href='/graphql')
v-list-item-title {{ $t('admin:dev.graphiql.title') }} v-list-item-title GraphQL
//- v-list-item(to='/dev-graphiql') //- v-list-item(to='/dev-graphiql')
//- v-list-item-title {{ $t('admin:dev.graphiql.title') }} //- v-list-item-title {{ $t('admin:dev.graphiql.title') }}
//- v-list-item(to='/dev-voyager') //- v-list-item(to='/dev-voyager')

View File

@ -148,16 +148,6 @@
persistent-hint persistent-hint
inset inset
) )
v-switch.ml-3(
v-if='strategy.key === `local`'
:disabled='!strategy.selfRegistration || true'
v-model='strategy.recaptcha'
label='Use reCAPTCHA by Google'
color='primary'
hint='Protects against spam robots and malicious registrations.'
persistent-hint
inset
)
v-combobox.ml-3.mt-3( v-combobox.ml-3.mt-3(
:label='$t(`admin:auth.domainsWhitelist`)' :label='$t(`admin:auth.domainsWhitelist`)'
v-model='strategy.domainWhitelist' v-model='strategy.domainWhitelist'
@ -191,7 +181,19 @@
) )
template(v-if='strategy.useForm') template(v-if='strategy.useForm')
v-divider.mt-3 v-divider.mt-3
.overline.my-5 {{$t('admin:auth.security')}} .d-flex.my-5.align-center
.overline {{$t('admin:auth.security')}}
v-chip.ml-3.grey--text(outlined, small, label) Coming soon
v-switch.ml-3(
v-if='strategy.key === `local`'
:disabled='!strategy.selfRegistration || true'
v-model='strategy.recaptcha'
label='Use reCAPTCHA by Google'
color='primary'
hint='Protects against spam robots and malicious registrations.'
persistent-hint
inset
)
v-switch.ml-3( v-switch.ml-3(
v-model='strategy.recaptcha' v-model='strategy.recaptcha'
:disabled='true' :disabled='true'

View File

@ -12,7 +12,7 @@
v-icon(left) mdi-check v-icon(left) mdi-check
span {{$t('common:actions.apply')}} span {{$t('common:actions.apply')}}
v-card.mt-3.white.grey--text.text--darken-3 v-card.mt-3(:class='$vuetify.theme.dark ? `grey darken-3-d5` : `white grey--text text--darken-3`')
v-alert(color='red', :value='true', icon='mdi-alert', dark, prominent) v-alert(color='red', :value='true', icon='mdi-alert', dark, prominent)
span Do NOT enable these flags unless you know what you're doing! span Do NOT enable these flags unless you know what you're doing!
.caption Doing so may result in data loss or broken installation! .caption Doing so may result in data loss or broken installation!

View File

@ -72,6 +72,7 @@
chips chips
deletable-chips deletable-chips
small-chips small-chips
height='48px'
style='flex: 0 1 440px;' style='flex: 0 1 440px;'
:menu-props='{ "maxHeight": 500 }' :menu-props='{ "maxHeight": 500 }'
clearable clearable
@ -99,6 +100,7 @@
v-model='rule.match' v-model='rule.match'
placeholder='Match...' placeholder='Match...'
hide-details hide-details
height='48px'
style='flex: 0 1 250px;' style='flex: 0 1 250px;'
dense dense
) )
@ -118,6 +120,7 @@
placeholder='Any Locale' placeholder='Any Locale'
multiple multiple
hide-details hide-details
height='48px'
dense dense
:menu-props='{ "minWidth": 250 }' :menu-props='{ "minWidth": 250 }'
style='flex: 0 1 150px;' style='flex: 0 1 150px;'
@ -161,7 +164,7 @@
:color='$vuetify.theme.dark ? `grey` : `blue-grey`' :color='$vuetify.theme.dark ? `grey` : `blue-grey`'
) )
v-btn.ml-2.mt-1(icon, @click='removeRule(rule.id)', small) v-btn.ml-2(icon, @click='removeRule(rule.id)', small)
v-icon(:color='$vuetify.theme.dark ? `grey` : `blue-grey`') mdi-close v-icon(:color='$vuetify.theme.dark ? `grey` : `blue-grey`') mdi-close
v-divider.mt-3 v-divider.mt-3
@ -277,6 +280,7 @@ export default {
background-color: mc('blue-grey', '100'); background-color: mc('blue-grey', '100');
border-radius: 4px; border-radius: 4px;
padding: .5rem; padding: .5rem;
align-items: center;
&-enter-active, &-leave-active { &-enter-active, &-leave-active {
transition: all .5s ease; transition: all .5s ease;

View File

@ -39,7 +39,7 @@
v-list-item-content v-list-item-content
v-list-item-title Unassign v-list-item-title Unassign
template(slot='no-data') template(slot='no-data')
v-alert.ma-3(icon='warning', outlined) No users to display. v-alert.ma-3(icon='mdi-alert', outlined) No users to display.
.text-center.py-2(v-if='group.users.length > 15') .text-center.py-2(v-if='group.users.length > 15')
v-pagination(v-model='pagination', :length='pageCount') v-pagination(v-model='pagination', :length='pageCount')

View File

@ -58,17 +58,17 @@
v-list-item v-list-item
v-list-item-content v-list-item-content
v-list-item-title: .overline.grey--text Title v-list-item-title: .overline.grey--text Title
v-list-item-subtitle.body-2.grey--text.text--darken-3 {{ page.title }} v-list-item-subtitle.body-2(:class='$vuetify.theme.dark ? `grey--text text--lighten-2` : `grey--text text--darken-3`') {{ page.title }}
v-divider v-divider
v-list-item v-list-item
v-list-item-content v-list-item-content
v-list-item-title: .overline.grey--text Description v-list-item-title: .overline.grey--text Description
v-list-item-subtitle.body-2.grey--text.text--darken-3 {{ page.description || '-' }} v-list-item-subtitle.body-2(:class='$vuetify.theme.dark ? `grey--text text--lighten-2` : `grey--text text--darken-3`') {{ page.description || '-' }}
v-divider v-divider
v-list-item v-list-item
v-list-item-content v-list-item-content
v-list-item-title: .overline.grey--text Locale v-list-item-title: .overline.grey--text Locale
v-list-item-subtitle.body-2.grey--text.text--darken-3 {{ page.locale }} v-list-item-subtitle.body-2(:class='$vuetify.theme.dark ? `grey--text text--lighten-2` : `grey--text text--darken-3`') {{ page.locale }}
v-list-item-action v-list-item-action
v-btn(icon, x-small) v-btn(icon, x-small)
v-icon(color='grey') mdi-pencil v-icon(color='grey') mdi-pencil
@ -76,7 +76,7 @@
v-list-item v-list-item
v-list-item-content v-list-item-content
v-list-item-title: .overline.grey--text Path v-list-item-title: .overline.grey--text Path
v-list-item-subtitle.body-2.grey--text.text--darken-3 {{ page.path }} v-list-item-subtitle.body-2(:class='$vuetify.theme.dark ? `grey--text text--lighten-2` : `grey--text text--darken-3`') {{ page.path }}
v-list-item-action v-list-item-action
v-btn(icon, x-small) v-btn(icon, x-small)
v-icon(color='grey') mdi-pencil v-icon(color='grey') mdi-pencil
@ -84,14 +84,14 @@
v-list-item v-list-item
v-list-item-content v-list-item-content
v-list-item-title: .overline.grey--text Editor v-list-item-title: .overline.grey--text Editor
v-list-item-subtitle.body-2.grey--text.text--darken-3 {{ page.editor || '?' }} v-list-item-subtitle.body-2(:class='$vuetify.theme.dark ? `grey--text text--lighten-2` : `grey--text text--darken-3`') {{ page.editor || '?' }}
v-divider v-divider
v-list-item v-list-item
v-list-item-content v-list-item-content
v-list-item-title: .overline.grey--text Content Type v-list-item-title: .overline.grey--text Content Type
v-list-item-subtitle.body-2.grey--text.text--darken-3 {{ page.contentType || '?' }} v-list-item-subtitle.body-2(:class='$vuetify.theme.dark ? `grey--text text--lighten-2` : `grey--text text--darken-3`') {{ page.contentType || '?' }}
v-toolbar.elevation-2.mt-3.animated.fadeInUp.wait-p4s(color='white', dense) v-toolbar.elevation-2.mt-3.animated.fadeInUp.wait-p4s(:color='$vuetify.theme.dark ? `grey darken-3-d5` : `white`', dense)
v-spacer v-spacer
v-btn(color='primary', text, :href='`/` + page.locale + `/` + page.path') v-btn(color='primary', text, :href='`/` + page.locale + `/` + page.path')
v-icon(left) mdi-text-subject v-icon(left) mdi-text-subject
@ -124,7 +124,7 @@
v-icon(color='grey') mdi-account v-icon(color='grey') mdi-account
v-list-item-content v-list-item-content
v-list-item-title: .overline.grey--text Creator v-list-item-title: .overline.grey--text Creator
v-list-item-subtitle.body-2.grey--text.text--darken-3 {{ page.creatorName }} #[em.caption ({{ page.creatorEmail }})] v-list-item-subtitle.body-2(:class='$vuetify.theme.dark ? `grey--text text--lighten-2` : `grey--text text--darken-3`') {{ page.creatorName }} #[em.caption ({{ page.creatorEmail }})]
v-list-item-action v-list-item-action
v-list-item-action-text {{ page.createdAt | moment('calendar') }} v-list-item-action-text {{ page.createdAt | moment('calendar') }}
v-divider v-divider
@ -134,7 +134,7 @@
v-icon(color='grey') mdi-account v-icon(color='grey') mdi-account
v-list-item-content v-list-item-content
v-list-item-title: .overline.grey--text Last Editor v-list-item-title: .overline.grey--text Last Editor
v-list-item-subtitle.body-2.grey--text.text--darken-3 {{ page.authorName }} #[em.caption ({{ page.authorEmail }})] v-list-item-subtitle.body-2(:class='$vuetify.theme.dark ? `grey--text text--lighten-2` : `grey--text text--darken-3`') {{ page.authorName }} #[em.caption ({{ page.authorEmail }})]
v-list-item-action v-list-item-action
v-list-item-action-text {{ page.updatedAt | moment('calendar') }} v-list-item-action-text {{ page.updatedAt | moment('calendar') }}
v-card.mt-3.animated.fadeInUp.wait-p4s v-card.mt-3.animated.fadeInUp.wait-p4s

View File

@ -1,20 +1,20 @@
<template lang="pug"> <template lang="pug">
.search-results(v-if='searchIsFocused || search.length > 1') .search-results(v-if='searchIsFocused || (search && search.length > 1)')
.search-results-container .search-results-container
.search-results-help(v-if='search.length < 2') .search-results-help(v-if='search && search.length < 2')
img(src='/svg/icon-search-alt.svg') img(src='/svg/icon-search-alt.svg')
.mt-4 {{$t('common:header.searchHint')}} .mt-4 {{$t('common:header.searchHint')}}
.search-results-loader(v-else-if='searchIsLoading && results.length < 1') .search-results-loader(v-else-if='searchIsLoading && (!results || results.length < 1)')
orbit-spinner( orbit-spinner(
:animation-duration='1000' :animation-duration='1000'
:size='100' :size='100'
color='#FFF' color='#FFF'
) )
.headline.mt-5 {{$t('common:header.searchLoading')}} .headline.mt-5 {{$t('common:header.searchLoading')}}
.search-results-none(v-else-if='!searchIsLoading && results.length < 1') .search-results-none(v-else-if='!searchIsLoading && (!results || results.length < 1)')
img(src='/svg/icon-no-results.svg', alt='No Results') img(src='/svg/icon-no-results.svg', alt='No Results')
.subheading {{$t('common:header.searchNoResult')}} .subheading {{$t('common:header.searchNoResult')}}
template(v-if='results.length > 0') template(v-if='results && results.length > 0')
v-subheader.white--text {{$t('common:header.searchResultsCount', { total: response.totalHits })}} v-subheader.white--text {{$t('common:header.searchResultsCount', { total: response.totalHits })}}
v-list.search-results-items.radius-7.py-0(two-line) v-list.search-results-items.radius-7.py-0(two-line)
template(v-for='(item, idx) of results') template(v-for='(item, idx) of results')
@ -34,7 +34,7 @@
v-model='pagination' v-model='pagination'
:length='paginationLength' :length='paginationLength'
) )
template(v-if='suggestions.length > 0') template(v-if='suggestions && suggestions.length > 0')
v-subheader.white--text.mt-3 {{$t('common:header.searchDidYouMean')}} v-subheader.white--text.mt-3 {{$t('common:header.searchDidYouMean')}}
v-list.search-results-suggestions.radius-7(dense, dark) v-list.search-results-suggestions.radius-7(dense, dark)
template(v-for='(term, idx) of suggestions') template(v-for='(term, idx) of suggestions')
@ -44,7 +44,7 @@
v-list-item-content v-list-item-content
v-list-item-title(v-html='term') v-list-item-title(v-html='term')
v-divider(v-if='idx < suggestions.length - 1') v-divider(v-if='idx < suggestions.length - 1')
.text-xs-center.pt-5(v-if='search.length > 1') .text-xs-center.pt-5(v-if='search && search.length > 1')
//- v-btn.mx-2(outlined, color='orange', @click='search = ``', v-if='results.length > 0') //- v-btn.mx-2(outlined, color='orange', @click='search = ``', v-if='results.length > 0')
//- v-icon(left) mdi-content-save //- v-icon(left) mdi-content-save
//- span {{$t('common:header.searchCopyLink')}} //- span {{$t('common:header.searchCopyLink')}}
@ -97,7 +97,7 @@ export default {
watch: { watch: {
search(newValue, oldValue) { search(newValue, oldValue) {
this.cursor = 0 this.cursor = 0
if (newValue.length < 2) { if (newValue && newValue.length < 2) {
this.response.results = [] this.response.results = []
this.response.suggestions = [] this.response.suggestions = []
} else { } else {
@ -107,6 +107,7 @@ export default {
}, },
mounted() { mounted() {
this.$root.$on('searchMove', (dir) => { this.$root.$on('searchMove', (dir) => {
console.info()
this.cursor += ((dir === 'up') ? -1 : 1) this.cursor += ((dir === 'up') ? -1 : 1)
if (this.cursor < -1) { if (this.cursor < -1) {
this.cursor = -1 this.cursor = -1
@ -115,6 +116,10 @@ export default {
} }
}) })
this.$root.$on('searchEnter', () => { this.$root.$on('searchEnter', () => {
if (!this.results) {
return
}
if (this.cursor >= 0 && this.cursor < this.results.length) { if (this.cursor >= 0 && this.cursor < this.results.length) {
this.goToPage(_.nth(this.results, this.cursor)) this.goToPage(_.nth(this.results, this.cursor))
} else if (this.cursor >= 0) { } else if (this.cursor >= 0) {

View File

@ -73,21 +73,21 @@
v-card.mb-5(v-if='tags.length > 0') v-card.mb-5(v-if='tags.length > 0')
.pa-5 .pa-5
.overline.teal--text.pb-2(:class='$vuetify.theme.dark ? `text--lighten-3` : ``') Tags .overline.teal--text.pb-2(:class='$vuetify.theme.dark ? `text--lighten-3` : ``') Tags
v-chip.mr-1( v-chip.mr-1.mb-1(
label label
color='teal lighten-5' :color='$vuetify.theme.dark ? `teal darken-1` : `teal lighten-5`'
v-for='(tag, idx) in tags' v-for='(tag, idx) in tags'
:href='`/t/` + tag.tag' :href='`/t/` + tag.tag'
:key='`tag-` + tag.tag' :key='`tag-` + tag.tag'
) )
v-icon(color='teal', left, small) mdi-tag v-icon(:color='$vuetify.theme.dark ? `teal lighten-3` : `teal`', left, small) mdi-tag
span.teal--text.text--darken-2 {{tag.title}} span(:class='$vuetify.theme.dark ? `teal--text text--lighten-5` : `teal--text text--darken-2`') {{tag.title}}
v-chip.mr-1( v-chip.mr-1(
label label
color='teal lighten-5' :color='$vuetify.theme.dark ? `teal darken-1` : `teal lighten-5`'
:href='`/t/` + tags.map(t => t.tag).join(`/`)' :href='`/t/` + tags.map(t => t.tag).join(`/`)'
) )
v-icon(color='teal', size='20') mdi-tag-multiple v-icon(:color='$vuetify.theme.dark ? `teal lighten-3` : `teal`', size='20') mdi-tag-multiple
v-card.mb-5 v-card.mb-5
.pa-5 .pa-5

View File

@ -32,22 +32,12 @@ module.exports = {
} }
// TODO: Add user permissions filtering // TODO: Add user permissions filtering
builder.andWhere(builderSub => { builder.andWhere(builderSub => {
switch (WIKI.config.db.type) { if (WIKI.config.db.type === 'postgres') {
case 'postgres':
builderSub.where('title', 'ILIKE', `%${q}%`) builderSub.where('title', 'ILIKE', `%${q}%`)
builderSub.orWhere('description', 'ILIKE', `%${q}%`) builderSub.orWhere('description', 'ILIKE', `%${q}%`)
break } else {
case 'mysql':
case 'mariadb':
builderSub.whereRaw(`title LIKE '%?%' COLLATE utf8_general_ci`, [q])
builderSub.orWhereRaw(`description LIKE '%?%' COLLATE utf8_general_ci`, [q])
break
// TODO: MSSQL handling
default:
builderSub.where('title', 'LIKE', `%${q}%`) builderSub.where('title', 'LIKE', `%${q}%`)
builderSub.orWhere('description', 'LIKE', `%${q}%`) builderSub.orWhere('description', 'LIKE', `%${q}%`)
break
} }
}) })
}) })