app/javascript/vue/tasks/uniquify/people/components/Filter/FilterPanel.vue
<template>
<div class="panel vue-filter-container">
<div class="flex-separate content middle action-line">
<span>Filter</span>
</div>
<div class="content">
<div class="field">
<button
class="button normal-input button-default full_width"
type="button"
@click="$emit('findPeople', parsedParams)"
>
Selected person
</button>
<button
class="button normal-input button-default full_width margin-medium-top"
type="button"
:disabled="disabledMatch"
@click="$emit('matchPeople', parsedParams)"
>
Match people
</button>
</div>
<facet-in-project v-model="params.base.only_project_id" />
<h3>Person</h3>
<facet-name-field
title="Name"
param="name"
v-model="params.base"
/>
<facet-name-field
title="Last name"
param="last_name"
:disabled="params.base.levenshtein_cuttoff > 0"
v-model="params.base"
/>
<facet-name-field
title="First name"
param="first_name"
:disabled="params.base.levenshtein_cuttoff > 0"
v-model="params.base"
/>
<facet-active v-model="params.active" />
<facet-born v-model="params.born" />
<facet-died v-model="params.died" />
<facet-levenshtein-cuttoff v-model="params.base.levenshtein_cuttoff" />
<facet-role-types v-model="params.base.role" />
<keywords-component
target="People"
v-model="params.base.keywords"
/>
<users-component v-model="params.user" />
</div>
</div>
</template>
<script>
import FacetActive from './Facets/FacetActive.vue'
import FacetBorn from './Facets/FacetBorn.vue'
import FacetDied from './Facets/FacetDied.vue'
import FacetRoleTypes from './Facets/FacetRoleType.vue'
import KeywordsComponent from '@/components/Filter/Facets/shared/FacetTags.vue'
import UsersComponent from '@/components/Filter/Facets/shared/FacetHousekeeping/FacetHousekeeping.vue'
import FacetLevenshteinCuttoff from './Facets/FacetLevenshteinCuttoff.vue'
import FacetNameField from './Facets/FacetNameField.vue'
import FacetInProject from './Facets/FacetInProject.vue'
export default {
components: {
FacetActive,
FacetBorn,
FacetDied,
FacetRoleTypes,
KeywordsComponent,
UsersComponent,
FacetLevenshteinCuttoff,
FacetNameField,
FacetInProject
},
props: {
disabledMatch: {
type: Boolean,
default: false
}
},
emits: ['findPeople', 'matchPeople'],
data() {
return {
params: this.initParams()
}
},
computed: {
parsedParams() {
return this.filterEmptyParams({
...this.params.base,
...this.params.keywords,
...this.params.active,
...this.params.born,
...this.params.died,
...this.params.user,
...this.params.settings
})
}
},
watch: {
levenshteinCuttoff(newVal) {
if (newVal !== 0) {
this.params.base.first_name = undefined
this.params.base.last_name = undefined
}
}
},
methods: {
initParams() {
return {
settings: {
per: 100
},
base: {
levenshtein_cuttoff: undefined,
last_name: '',
first_name: '',
role: [],
person_wildcard: [],
only_project_id: []
},
keywords: {
keyword_id_and: [],
keyword_id_or: []
},
active: {
active_before_year: undefined,
active_after_year: undefined
},
born: {
born_before_year: undefined,
born_after_year: undefined
},
died: {
died_before_year: undefined,
died_after_year: undefined
},
user: {
user_id: undefined,
user_target: undefined,
user_date_start: undefined,
user_date_end: undefined
}
}
},
filterEmptyParams(object) {
const keys = Object.keys(object)
keys.forEach((key) => {
if (object[key] === '') {
delete object[key]
}
})
return object
},
resetFilter() {
this.params = this.initParams()
}
}
}
</script>