Graphql: highlight fields on search

This commit is contained in:
leoGeorges
2020-10-04 11:46:16 +02:00
parent 12941a107d
commit 76eba3d638
3 changed files with 59 additions and 4 deletions

View File

@@ -1,6 +1,6 @@
<template> <template>
<div class="p-2 m-2 border-b border-dashed border-brdColor"> <div class="p-2 m-2 border-b border-dashed border-brdColor">
<div class="field-title"> <div class="field-title" :class="{ 'field-highlighted': isHighlighted }">
{{ fieldName }} {{ fieldName }}
<span v-if="fieldArgs.length > 0"> <span v-if="fieldArgs.length > 0">
( (
@@ -25,11 +25,18 @@
</div> </div>
</template> </template>
<style scoped lang="scss">
.field-highlighted {
color: #ffff00;
}
</style>
<script> <script>
export default { export default {
props: { props: {
gqlField: Object, gqlField: Object,
jumpTypeCallback: Function, jumpTypeCallback: Function,
isHighlighted: { type: Boolean, default: false },
}, },
computed: { computed: {

View File

@@ -1,23 +1,44 @@
<template> <template>
<div class="p-2 m-2"> <div class="p-2 m-2">
<div class="font-bold type-title">{{ gqlType.name }}</div> <div class="font-bold type-title" :class="{ 'type-highlighted': isHighlighted }">
{{ gqlType.name }}
</div>
<div class="mt-2 text-fgLightColor type-desc" v-if="gqlType.description"> <div class="mt-2 text-fgLightColor type-desc" v-if="gqlType.description">
{{ gqlType.description }} {{ gqlType.description }}
</div> </div>
<div v-if="gqlType.getFields"> <div v-if="gqlType.getFields">
<h5>{{ $t("fields") }}</h5> <h5>{{ $t("fields") }}</h5>
<div v-for="field in gqlType.getFields()" :key="field.name"> <div v-for="field in gqlType.getFields()" :key="field.name">
<field :gqlField="field" :jumpTypeCallback="jumpTypeCallback" /> <field
:gqlField="field"
:isHighlighted="isFieldHighlighted({ field })"
:jumpTypeCallback="jumpTypeCallback"
/>
</div> </div>
</div> </div>
</div> </div>
</template> </template>
<style scoped lang="scss">
.type-highlighted {
color: #ffff00;
}
</style>
<script> <script>
export default { export default {
props: { props: {
gqlType: {}, gqlType: {},
jumpTypeCallback: Function, jumpTypeCallback: Function,
isHighlighted: { type: Boolean, default: false },
highlightedFields: { type: Array, default: [] },
},
methods: {
isFieldHighlighted({ field }) {
return !!this.highlightedFields.find(
(highlightedField) => highlightedField.name === field.name
)
},
}, },
} }
</script> </script>

View File

@@ -295,7 +295,12 @@
<tab v-if="gqlTypes.length > 0" :id="'types'" :label="$t('types')" ref="typesTab"> <tab v-if="gqlTypes.length > 0" :id="'types'" :label="$t('types')" ref="typesTab">
<div v-for="type in filteredGqlTypes" :key="type.name" :id="`type_${type.name}`"> <div v-for="type in filteredGqlTypes" :key="type.name" :id="`type_${type.name}`">
<type :gqlType="type" :jumpTypeCallback="handleJumpToType" /> <type
:gqlType="type"
:isHighlighted="isGqlTypeHighlighted({ gqlType: type })"
:highlightedFields="getGqlTypeHighlightedFields({ gqlType: type })"
:jumpTypeCallback="handleJumpToType"
/>
</div> </div>
</tab> </tab>
</div> </div>
@@ -451,6 +456,28 @@ export default {
} }
}, },
methods: { methods: {
isGqlTypeHighlighted({ gqlType }) {
if (!this.graphqlFieldsFilterText) return false
return this.isTextFoundInGraphqlFieldObject({
text: this.graphqlFieldsFilterText,
graphqlFieldObject: gqlType,
})
},
getGqlTypeHighlightedFields({ gqlType }) {
if (!this.graphqlFieldsFilterText) return []
const fields = Object.values(gqlType._fields || {})
if (!fields || fields.length === 0) return []
return fields.filter((field) => {
return this.isTextFoundInGraphqlFieldObject({
text: this.graphqlFieldsFilterText,
graphqlFieldObject: field,
})
})
},
isTextFoundInGraphqlFieldObject({ text, graphqlFieldObject }) { isTextFoundInGraphqlFieldObject({ text, graphqlFieldObject }) {
const normalizedText = text.toLowerCase() const normalizedText = text.toLowerCase()