Browse Source

fix: nested webhook filter related issues

pull/8479/head
Pranav C 5 months ago
parent
commit
a55a5466dd
  1. 27
      packages/nc-gui/components/smartsheet/toolbar/ColumnFilter.vue
  2. 26
      packages/nc-gui/composables/useViewFilters.ts
  3. 10
      packages/nocodb/src/helpers/webhookHelpers.ts
  4. 4
      packages/nocodb/src/models/Filter.ts

27
packages/nc-gui/components/smartsheet/toolbar/ColumnFilter.vue

@ -12,6 +12,7 @@ interface Props {
webHook?: boolean webHook?: boolean
draftFilter?: Partial<FilterType> draftFilter?: Partial<FilterType>
} }
const props = withDefaults(defineProps<Props>(), { const props = withDefaults(defineProps<Props>(), {
nestedLevel: 0, nestedLevel: 0,
autoSave: true, autoSave: true,
@ -21,13 +22,14 @@ const props = withDefaults(defineProps<Props>(), {
webHook: false, webHook: false,
}) })
const emit = defineEmits(['update:filtersLength', 'update:draftFilter']) const emit = defineEmits(['update:filtersLength', 'update:draftFilter', 'update:modelValue'])
const excludedFilterColUidt = [UITypes.QrCode, UITypes.Barcode] const excludedFilterColUidt = [UITypes.QrCode, UITypes.Barcode]
const draftFilter = useVModel(props, 'draftFilter', emit) const draftFilter = useVModel(props, 'draftFilter', emit)
const modelValue = useVModel(props, 'modelValue', emit)
const { nestedLevel, parentId, autoSave, hookId, modelValue, showLoading, webHook } = toRefs(props) const { nestedLevel, parentId, autoSave, hookId, showLoading, webHook } = toRefs(props)
const nested = computed(() => nestedLevel.value > 0) const nested = computed(() => nestedLevel.value > 0)
@ -66,7 +68,7 @@ const {
types, types,
} = useViewFilters( } = useViewFilters(
activeView, activeView,
parentId?.value, parentId,
computed(() => autoSave.value), computed(() => autoSave.value),
() => reloadDataHook.trigger({ shouldShowLoading: showLoading.value, offset: 0 }), () => reloadDataHook.trigger({ shouldShowLoading: showLoading.value, offset: 0 }),
modelValue.value || nestedFilters.value, modelValue.value || nestedFilters.value,
@ -204,8 +206,10 @@ const applyChanges = async (hookId?: string, nested = false, isConditionSupporte
if (!localNestedFilters.value?.length) return if (!localNestedFilters.value?.length) return
await nextTick()
for (const nestedFilter of localNestedFilters.value) { for (const nestedFilter of localNestedFilters.value) {
if (nestedFilter.parentId) { if (nestedFilter.parentId?.value) {
await nestedFilter.applyChanges(hookId, true) await nestedFilter.applyChanges(hookId, true)
} }
} }
@ -250,7 +254,7 @@ const updateFilterValue = (value: string, filter: Filter, index: number) => {
defineExpose({ defineExpose({
applyChanges, applyChanges,
parentId: parentId?.value, parentId,
}) })
const scrollToBottom = () => { const scrollToBottom = () => {
@ -373,6 +377,17 @@ const onLogicalOpUpdate = async (filter: Filter, index: number) => {
} }
await saveOrUpdate(filter, index) await saveOrUpdate(filter, index)
} }
// watch for changes in filters and update the modelValue
watch(
filters,
() => {
if (modelValue.value !== filters.value) modelValue.value = filters.value
},
{
immediate: true,
},
)
</script> </script>
<template> <template>
@ -436,7 +451,7 @@ const onLogicalOpUpdate = async (filter: Filter, index: number) => {
</div> </div>
<div class="flex border-1 rounded-lg p-2 w-full" :class="nestedLevel % 2 !== 0 ? 'bg-white' : 'bg-gray-100'"> <div class="flex border-1 rounded-lg p-2 w-full" :class="nestedLevel % 2 !== 0 ? 'bg-white' : 'bg-gray-100'">
<LazySmartsheetToolbarColumnFilter <LazySmartsheetToolbarColumnFilter
v-if="filter.id || filter.children" v-if="filter.id || filter.children || !autoSave"
:key="filter.id ?? i" :key="filter.id ?? i"
ref="localNestedFilters" ref="localNestedFilters"
v-model="filter.children" v-model="filter.children"

26
packages/nc-gui/composables/useViewFilters.ts

@ -12,7 +12,7 @@ import { UITypes, isSystemColumn } from 'nocodb-sdk'
export function useViewFilters( export function useViewFilters(
view: Ref<ViewType | undefined>, view: Ref<ViewType | undefined>,
parentId?: string, parentId: Ref<string | null>,
autoApply?: ComputedRef<boolean>, autoApply?: ComputedRef<boolean>,
reloadData?: () => void, reloadData?: () => void,
_currentFilters?: Filter[], _currentFilters?: Filter[],
@ -240,14 +240,14 @@ export function useViewFilters(
try { try {
if (isWebhook || hookId) { if (isWebhook || hookId) {
if (parentId) { if (parentId.value) {
filters.value = (await $api.dbTableFilter.childrenRead(parentId)).list as Filter[] filters.value = (await $api.dbTableFilter.childrenRead(parentId.value)).list as Filter[]
} else if (hookId) { } else if (hookId) {
filters.value = (await $api.dbTableWebhookFilter.read(hookId)).list as Filter[] filters.value = (await $api.dbTableWebhookFilter.read(hookId)).list as Filter[]
} }
} else { } else {
if (parentId) { if (parentId.value) {
filters.value = (await $api.dbTableFilter.childrenRead(parentId)).list as Filter[] filters.value = (await $api.dbTableFilter.childrenRead(parentId.value)).list as Filter[]
} else { } else {
filters.value = (await $api.dbTableFilter.read(view.value!.id!)).list as Filter[] filters.value = (await $api.dbTableFilter.read(view.value!.id!)).list as Filter[]
if (loadAllFilters) { if (loadAllFilters) {
@ -275,21 +275,25 @@ export function useViewFilters(
} else if (filter.status === 'update') { } else if (filter.status === 'update') {
await $api.dbTableFilter.update(filter.id as string, { await $api.dbTableFilter.update(filter.id as string, {
...filter, ...filter,
fk_parent_id: parentId, fk_parent_id: parentId.value,
}) })
} else if (filter.status === 'create') { } else if (filter.status === 'create') {
// extract children value if found to restore
const children = filters.value[+i]?.children
if (hookId) { if (hookId) {
filters.value[+i] = (await $api.dbTableWebhookFilter.create(hookId, { filters.value[+i] = (await $api.dbTableWebhookFilter.create(hookId, {
...filter, ...filter,
fk_parent_id: parentId, fk_parent_id: parentId.value,
})) as unknown as FilterType })) as unknown as FilterType
} else { } else {
filters.value[+i] = await $api.dbTableFilter.create(view?.value?.id as string, { filters.value[+i] = await $api.dbTableFilter.create(view?.value?.id as string, {
...filter, ...filter,
fk_parent_id: parentId, fk_parent_id: parentId.value,
}) })
} }
if (children) filters.value[+i].children = children
allFilters.value.push(filters.value[+i]) allFilters.value.push(filters.value[+i])
} }
} }
@ -345,7 +349,7 @@ export function useViewFilters(
} else if (filter.id && filter.status !== 'create') { } else if (filter.id && filter.status !== 'create') {
await $api.dbTableFilter.update(filter.id, { await $api.dbTableFilter.update(filter.id, {
...filter, ...filter,
fk_parent_id: parentId, fk_parent_id: parentId.value,
}) })
$e('a:filter:update', { $e('a:filter:update', {
logical: filter.logical_op, logical: filter.logical_op,
@ -354,7 +358,7 @@ export function useViewFilters(
} else { } else {
filters.value[i] = await $api.dbTableFilter.create(view.value.id!, { filters.value[i] = await $api.dbTableFilter.create(view.value.id!, {
...filter, ...filter,
fk_parent_id: parentId, fk_parent_id: parentId.value,
}) })
allFilters.value.push(filters.value[+i]) allFilters.value.push(filters.value[+i])
@ -482,7 +486,7 @@ export function useViewFilters(
const index = filters.value.length - 1 const index = filters.value.length - 1
await saveOrUpdate(filters.value[index], index, true) await saveOrUpdate(filters.value[index], index)
lastFilters.value = clone(filters.value) lastFilters.value = clone(filters.value)

10
packages/nocodb/src/helpers/webhookHelpers.ts

@ -51,9 +51,6 @@ export async function validateCondition(
for (const _filter of filters) { for (const _filter of filters) {
const filter = _filter instanceof Filter ? _filter : new Filter(_filter); const filter = _filter instanceof Filter ? _filter : new Filter(_filter);
let res; let res;
const column = await filter.getColumn();
const field = column.title;
let val = data[field];
if (filter.is_group) { if (filter.is_group) {
res = await validateCondition( res = await validateCondition(
filter.children || (await filter.getChildren()), filter.children || (await filter.getChildren()),
@ -62,7 +59,11 @@ export async function validateCondition(
client, client,
}, },
); );
} else if ( } else {
const column = await filter.getColumn();
const field = column.title;
let val = data[field];
if (
[ [
UITypes.Date, UITypes.Date,
UITypes.DateTime, UITypes.DateTime,
@ -296,6 +297,7 @@ export async function validateCondition(
break; break;
} }
} }
}
switch (filter.logical_op) { switch (filter.logical_op) {
case 'or': case 'or':

4
packages/nocodb/src/models/Filter.ts

@ -515,7 +515,9 @@ export default class Filter implements FilterType {
}); });
await NocoCache.setList(CacheScope.FILTER_EXP, [hookId], filterObjs); await NocoCache.setList(CacheScope.FILTER_EXP, [hookId], filterObjs);
} }
return filterObjs?.map((f) => this.castType(f)); return filterObjs
?.filter((f) => !f.fk_parent_id)
?.map((f) => this.castType(f));
} }
static async parentFilterList( static async parentFilterList(

Loading…
Cancel
Save