|
|
|
import type { FilterType, GalleryType, GridType, KanbanType } from 'nocodb-sdk'
|
|
|
|
import type { Ref } from 'vue'
|
|
|
|
import { useNuxtApp } from '#imports'
|
|
|
|
|
|
|
|
export default function (
|
|
|
|
view: Ref<(GridType | KanbanType | GalleryType) & { id?: string }> | undefined,
|
|
|
|
parentId?: string,
|
|
|
|
reloadData?: () => void,
|
|
|
|
) {
|
|
|
|
const filters = ref<(FilterType & { status?: 'update' | 'delete' })[]>([])
|
|
|
|
|
|
|
|
const { $api } = useNuxtApp()
|
|
|
|
|
|
|
|
const loadFilters = async () => {
|
|
|
|
if (parentId) {
|
|
|
|
filters.value = await $api.dbTableFilter.childrenRead(parentId)
|
|
|
|
} else {
|
|
|
|
filters.value = await $api.dbTableFilter.read(view?.value?.id as string)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
const sync = async (_nested = false) => {
|
|
|
|
for (const [i, filter] of Object.entries(filters.value)) {
|
|
|
|
if (filter.status === 'delete') {
|
|
|
|
await $api.dbTableFilter.delete(filter.id as string)
|
|
|
|
} else if (filter.status === 'update') {
|
|
|
|
await $api.dbTableFilter.update(filter.id as string, {
|
|
|
|
...filter,
|
|
|
|
fk_parent_id: parentId,
|
|
|
|
})
|
|
|
|
} else {
|
|
|
|
filters.value[+i] = (await $api.dbTableFilter.create(view?.value?.id as string, {
|
|
|
|
...filter,
|
|
|
|
fk_parent_id: parentId,
|
|
|
|
})) as any
|
|
|
|
}
|
|
|
|
}
|
|
|
|
reloadData?.()
|
|
|
|
}
|
|
|
|
|
|
|
|
const deleteFilter = async (filter: FilterType, i: number) => {
|
|
|
|
// if (this.shared || !this._isUIAllowed('filterSync')) {
|
|
|
|
// this.filters.splice(i, 1)
|
|
|
|
// this.$emit('updated')
|
|
|
|
// } else
|
|
|
|
|
|
|
|
if (filter.id) {
|
|
|
|
// if (!this.autoApply) {
|
|
|
|
// this.$set(filter, 'status', 'delete')
|
|
|
|
// } else {
|
|
|
|
await $api.dbTableFilter.delete(filter.id) /**/
|
|
|
|
// await this.loadFilter()
|
|
|
|
// this.$emit('updated')
|
|
|
|
// }
|
|
|
|
} else {
|
|
|
|
// this.$emit('updated')
|
|
|
|
}
|
|
|
|
const _filters = unref(filters.value)
|
|
|
|
_filters.splice(i, 1)
|
|
|
|
filters.value = _filters
|
|
|
|
// this.$e('a:filter:delete')
|
|
|
|
// // },
|
|
|
|
reloadData?.()
|
|
|
|
}
|
|
|
|
|
|
|
|
const saveOrUpdate = async (filter: FilterType, i: number) => {
|
|
|
|
if (!view?.value) return
|
|
|
|
|
|
|
|
// if (this.shared || !this._isUIAllowed('filterSync')) {
|
|
|
|
// this.$emit('input', this.filters.filter(f => f.fk_column_id && f.comparison_op))
|
|
|
|
// this.$emit('updated')
|
|
|
|
// } else if (!this.autoApply) {
|
|
|
|
// filter.status = 'update'
|
|
|
|
// } else
|
|
|
|
if (filter.id) {
|
|
|
|
await $api.dbTableFilter.update(filter.id, {
|
|
|
|
...filter,
|
|
|
|
fk_parent_id: parentId,
|
|
|
|
})
|
|
|
|
|
|
|
|
// this.$emit('updated')
|
|
|
|
} else {
|
|
|
|
// todo: return type correction
|
|
|
|
filters.value[i] = (await $api.dbTableFilter.create(view?.value?.id as string, {
|
|
|
|
...filter,
|
|
|
|
fk_parent_id: parentId,
|
|
|
|
})) as any
|
|
|
|
|
|
|
|
// this.$emit('updated')
|
|
|
|
}
|
|
|
|
reloadData?.()
|
|
|
|
}
|
|
|
|
|
|
|
|
const addFilter = () => {
|
|
|
|
filters.value.push({
|
|
|
|
comparison_op: 'eq',
|
|
|
|
value: '',
|
|
|
|
status: 'update',
|
|
|
|
logical_op: 'and',
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
return { filters, loadFilters, sync, deleteFilter, saveOrUpdate, addFilter }
|
|
|
|
}
|