From 77548c8778bdd9e30379318d219fa892d5ffc112 Mon Sep 17 00:00:00 2001 From: NGPixel Date: Thu, 9 Apr 2020 21:56:24 -0400 Subject: [PATCH] fix: tags input normalization --- .../editor/editor-modal-properties.vue | 23 ++++++++++--------- server/graph/resolvers/page.js | 11 +++++---- server/models/tags.js | 2 +- 3 files changed, 19 insertions(+), 17 deletions(-) diff --git a/client/components/editor/editor-modal-properties.vue b/client/components/editor/editor-modal-properties.vue index 792f60a9..c4c02a99 100644 --- a/client/components/editor/editor-modal-properties.vue +++ b/client/components/editor/editor-modal-properties.vue @@ -80,19 +80,14 @@ v-combobox( :label='$t(`editor:props.tags`)' outlined - v-model='tags' + v-model='newTag' :hint='$t(`editor:props.tagsHint`)' :items='newTagSuggestions' :loading='$apollo.queries.newTagSuggestions.loading' persistent-hint - deletable-chips hide-no-data - hide-selected :search-input.sync='newTagSearch' - multiple ) - template(v-slot:selection='{ attrs, item, parent, selected }') - span v-tab-item v-card-text .overline.pb-5 {{$t('editor:props.publishState')}} #[v-chip.ml-3(label, color='grey', small, outlined).white--text coming soon] @@ -306,14 +301,20 @@ export default { // this.$tours['editorPropertiesTour'].start() }, 500) } + }, + newTag(newValue, oldValue) { + const tagClean = _.trim(newValue || '').toLowerCase() + if (tagClean && tagClean.length > 0) { + if (!_.includes(this.tags, tagClean)) { + this.tags = [...this.tags, tagClean] + } + this.$nextTick(() => { + this.newTag = null + }) + } } }, methods: { - addTag () { - this.$nextTick(() => { - this.tags.push(this.newTag) - }) - }, removeTag (tag) { this.tags = _.without(this.tags, tag) }, diff --git a/server/graph/resolvers/page.js b/server/graph/resolvers/page.js index 325c8800..1de71b98 100644 --- a/server/graph/resolvers/page.js +++ b/server/graph/resolvers/page.js @@ -110,7 +110,7 @@ module.exports = { } } if (args.tags && args.tags.length > 0) { - queryBuilder.whereIn('tags.tag', args.tags) + queryBuilder.whereIn('tags.tag', args.tags.map(t => _.trim(t).toLowerCase())) } const orderDir = args.orderByDirection === 'DESC' ? 'desc' : 'asc' switch (args.orderBy) { @@ -177,14 +177,15 @@ module.exports = { * SEARCH TAGS */ async searchTags (obj, args, context, info) { + const query = _.trim(args.query) const results = await WIKI.models.tags.query() .column('tag') .where(builder => { builder.andWhere(builderSub => { if (WIKI.config.db.type === 'postgres') { - builderSub.where('tag', 'ILIKE', `%${args.query}%`) + builderSub.where('tag', 'ILIKE', `%${query}%`) } else { - builderSub.where('tag', 'LIKE', `%${args.query}%`) + builderSub.where('tag', 'LIKE', `%${query}%`) } }) }) @@ -400,8 +401,8 @@ module.exports = { const affectedRows = await WIKI.models.tags.query() .findById(args.id) .patch({ - tag: args.tag, - title: args.title + tag: _.trim(args.tag).toLowerCase(), + title: _.trim(args.title) }) if (affectedRows < 1) { throw new Error('This tag does not exist.') diff --git a/server/models/tags.js b/server/models/tags.js index 18260810..0794fb64 100644 --- a/server/models/tags.js +++ b/server/models/tags.js @@ -55,7 +55,7 @@ module.exports = class Tag extends Model { // Format tags - tags = _.uniq(tags.map(t => t.toLowerCase())) + tags = _.uniq(tags.map(t => _.trim(t).toLowerCase())) // Create missing tags