fix: moved quick filter field in separate component and added debounce
This commit is contained in:
parent
5d234965d5
commit
2c7a4ccd2a
64
frontend/src/components/QuickFilterField.vue
Normal file
64
frontend/src/components/QuickFilterField.vue
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
<template>
|
||||||
|
<FormControl
|
||||||
|
v-if="filter.type == 'Check'"
|
||||||
|
:label="filter.label"
|
||||||
|
type="checkbox"
|
||||||
|
v-model="filter.value"
|
||||||
|
@change.stop="updateFilter(filter, $event.target.checked)"
|
||||||
|
/>
|
||||||
|
<FormControl
|
||||||
|
v-else-if="filter.type === 'Select'"
|
||||||
|
class="form-control cursor-pointer [&_select]:cursor-pointer"
|
||||||
|
type="select"
|
||||||
|
v-model="filter.value"
|
||||||
|
:options="filter.options"
|
||||||
|
:placeholder="filter.label"
|
||||||
|
@change.stop="updateFilter(filter, $event.target.value)"
|
||||||
|
/>
|
||||||
|
<Link
|
||||||
|
v-else-if="filter.type === 'Link'"
|
||||||
|
:value="filter.value"
|
||||||
|
:doctype="filter.options"
|
||||||
|
:placeholder="filter.label"
|
||||||
|
@change="(data) => updateFilter(filter, data)"
|
||||||
|
/>
|
||||||
|
<component
|
||||||
|
v-else-if="['Date', 'Datetime'].includes(filter.type)"
|
||||||
|
class="border-none"
|
||||||
|
:is="filter.type === 'Date' ? DatePicker : DatetimePicker"
|
||||||
|
:value="filter.value"
|
||||||
|
@change="(v) => updateFilter(filter, v)"
|
||||||
|
:placeholder="filter.label"
|
||||||
|
/>
|
||||||
|
<TextInput
|
||||||
|
v-else
|
||||||
|
v-model="filter.value"
|
||||||
|
type="text"
|
||||||
|
:placeholder="filter.label"
|
||||||
|
@input.stop="debouncedFn(filter, $event.target.value)"
|
||||||
|
/>
|
||||||
|
</template>
|
||||||
|
<script setup>
|
||||||
|
import DatePicker from '@/components/Controls/DatePicker.vue'
|
||||||
|
import DatetimePicker from '@/components/Controls/DatetimePicker.vue'
|
||||||
|
import Link from '@/components/Controls/Link.vue'
|
||||||
|
import { TextInput, FormControl } from 'frappe-ui'
|
||||||
|
import { useDebounceFn } from '@vueuse/core'
|
||||||
|
|
||||||
|
const props = defineProps({
|
||||||
|
filter: {
|
||||||
|
type: Object,
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
const emit = defineEmits(['applyQuickFilter'])
|
||||||
|
|
||||||
|
const debouncedFn = useDebounceFn((f, value) => {
|
||||||
|
emit('applyQuickFilter', f, value)
|
||||||
|
}, 500)
|
||||||
|
|
||||||
|
function updateFilter(f, value) {
|
||||||
|
emit('applyQuickFilter', f, value)
|
||||||
|
}
|
||||||
|
</script>
|
||||||
@ -96,44 +96,9 @@
|
|||||||
:key="filter.name"
|
:key="filter.name"
|
||||||
class="m-1 min-w-36"
|
class="m-1 min-w-36"
|
||||||
>
|
>
|
||||||
<FormControl
|
<QuickFilterField
|
||||||
v-if="filter.type == 'Check'"
|
:filter="filter"
|
||||||
:label="filter.label"
|
@applyQuickFilter="(f, v) => applyQuickFilter(f, v)"
|
||||||
type="checkbox"
|
|
||||||
v-model="filter.value"
|
|
||||||
@change.stop="applyQuickFilter(filter, $event.target.checked)"
|
|
||||||
/>
|
|
||||||
<FormControl
|
|
||||||
v-else-if="filter.type === 'Select'"
|
|
||||||
class="form-control cursor-pointer [&_select]:cursor-pointer"
|
|
||||||
type="select"
|
|
||||||
v-model="filter.value"
|
|
||||||
:options="filter.options"
|
|
||||||
:placeholder="filter.label"
|
|
||||||
@change.stop="applyQuickFilter(filter, $event.target.value)"
|
|
||||||
/>
|
|
||||||
<Link
|
|
||||||
v-else-if="filter.type === 'Link'"
|
|
||||||
:value="filter.value"
|
|
||||||
:doctype="filter.options"
|
|
||||||
:placeholder="filter.label"
|
|
||||||
@change="(data) => applyQuickFilter(filter, data)"
|
|
||||||
/>
|
|
||||||
<component
|
|
||||||
v-else-if="['Date', 'Datetime'].includes(filter.type)"
|
|
||||||
class="border-none"
|
|
||||||
:is="filter.type === 'Date' ? DatePicker : DatetimePicker"
|
|
||||||
:value="filter.value"
|
|
||||||
@change="(v) => applyQuickFilter(filter, v)"
|
|
||||||
:placeholder="filter.label"
|
|
||||||
/>
|
|
||||||
<TextInput
|
|
||||||
v-else
|
|
||||||
:value="filter.value"
|
|
||||||
type="text"
|
|
||||||
:placeholder="filter.label"
|
|
||||||
:debounce="500"
|
|
||||||
@input.stop="applyQuickFilter(filter, $event.target.value)"
|
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</FadedScrollableDiv>
|
</FadedScrollableDiv>
|
||||||
@ -247,9 +212,7 @@
|
|||||||
</Dialog>
|
</Dialog>
|
||||||
</template>
|
</template>
|
||||||
<script setup>
|
<script setup>
|
||||||
import DatePicker from '@/components/Controls/DatePicker.vue'
|
import QuickFilterField from '@/components/QuickFilterField.vue'
|
||||||
import DatetimePicker from '@/components/Controls/DatetimePicker.vue'
|
|
||||||
import Link from '@/components/Controls/Link.vue'
|
|
||||||
import RefreshIcon from '@/components/Icons/RefreshIcon.vue'
|
import RefreshIcon from '@/components/Icons/RefreshIcon.vue'
|
||||||
import EditIcon from '@/components/Icons/EditIcon.vue'
|
import EditIcon from '@/components/Icons/EditIcon.vue'
|
||||||
import DuplicateIcon from '@/components/Icons/DuplicateIcon.vue'
|
import DuplicateIcon from '@/components/Icons/DuplicateIcon.vue'
|
||||||
@ -264,13 +227,7 @@ import { globalStore } from '@/stores/global'
|
|||||||
import { viewsStore } from '@/stores/views'
|
import { viewsStore } from '@/stores/views'
|
||||||
import { usersStore } from '@/stores/users'
|
import { usersStore } from '@/stores/users'
|
||||||
import { isEmoji } from '@/utils'
|
import { isEmoji } from '@/utils'
|
||||||
import {
|
import { createResource, Dropdown, call, FeatherIcon } from 'frappe-ui'
|
||||||
createResource,
|
|
||||||
Dropdown,
|
|
||||||
call,
|
|
||||||
FeatherIcon,
|
|
||||||
TextInput,
|
|
||||||
} from 'frappe-ui'
|
|
||||||
import { computed, ref, onMounted, watch, h } from 'vue'
|
import { computed, ref, onMounted, watch, h } from 'vue'
|
||||||
import { useRouter, useRoute } from 'vue-router'
|
import { useRouter, useRoute } from 'vue-router'
|
||||||
import { useDebounceFn } from '@vueuse/core'
|
import { useDebounceFn } from '@vueuse/core'
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user