import type { Api, ExportTypes, FilterType, KanbanType, PaginatedType, RequestParams, SortType, TableType, ViewType, } from 'nocodb-sdk' import { UITypes } from 'nocodb-sdk' import { computed, useGlobal, useMetas, useNuxtApp, useState } from '#imports' export function useSharedView() { const nestedFilters = ref<(FilterType & { status?: 'update' | 'delete' | 'create'; parentId?: string })[]>([]) const { appInfo } = $(useGlobal()) const appInfoDefaultLimit = appInfo.defaultLimit || 25 const paginationData = useState('paginationData', () => ({ page: 1, pageSize: appInfoDefaultLimit })) const sharedView = useState('sharedView', () => undefined) const sorts = ref([]) const password = useState('password', () => undefined) const allowCSVDownload = useState('allowCSVDownload', () => false) const meta = useState('meta', () => undefined) const formColumns = computed( () => (meta.value as TableType)?.columns ?.filter( (f: Record) => f.show && f.uidt !== UITypes.Rollup && f.uidt !== UITypes.Lookup && f.uidt !== UITypes.Formula && f.uidt !== UITypes.QrCode, ) .sort((a: Record, b: Record) => a.order - b.order) .map((c: Record) => ({ ...c, required: !!(c.required || 0) })) ?? [], ) const { $api } = useNuxtApp() const { setMeta } = useMetas() const loadSharedView = async (viewId: string, localPassword: string | undefined = undefined) => { const viewMeta: Record = await $api.public.sharedViewMetaGet(viewId, { headers: { 'xc-password': localPassword ?? password.value, }, }) allowCSVDownload.value = JSON.parse(viewMeta.meta)?.allowCSVDownload if (localPassword) password.value = localPassword sharedView.value = { title: '', ...viewMeta } meta.value = { ...viewMeta.model } let order = 1 meta.value!.columns = [...viewMeta.model.columns] .filter((c) => c.show) .map((c) => ({ ...c, order: order++ })) .sort((a, b) => a.order - b.order) await setMeta(viewMeta.model) const relatedMetas = { ...viewMeta.relatedMetas } Object.keys(relatedMetas).forEach((key) => setMeta(relatedMetas[key])) } const fetchSharedViewData = async ({ sortsArr, filtersArr }: { sortsArr: SortType[]; filtersArr: FilterType[] }) => { if (!sharedView.value) return const page = paginationData.value.page || 1 const pageSize = paginationData.value.pageSize || appInfoDefaultLimit const { data } = await $api.public.dataList( sharedView.value.uuid!, { offset: (page - 1) * pageSize, filterArrJson: JSON.stringify(filtersArr ?? nestedFilters.value), sortArrJson: JSON.stringify(sortsArr ?? sorts.value), } as any, { headers: { 'xc-password': password.value, }, }, ) return data } const fetchSharedViewGroupedData = async (columnId: string, params: Parameters['dbViewRow']['list']>[4] = {}) => { if (!sharedView.value) return const page = paginationData.value.page || 1 const pageSize = paginationData.value.pageSize || appInfoDefaultLimit const data = await $api.public.groupedDataList( sharedView.value.uuid!, columnId, { offset: (page - 1) * pageSize, filterArrJson: JSON.stringify(nestedFilters.value), sortArrJson: JSON.stringify(sorts.value), ...params, } as any, { headers: { 'xc-password': password.value, }, }, ) return data } const exportFile = async ( fields: any[], offset: number, type: ExportTypes.EXCEL | ExportTypes.CSV, responseType: 'base64' | 'blob', { sortsArr, filtersArr }: { sortsArr: SortType[]; filtersArr: FilterType[] }, ) => { return await $api.public.csvExport(sharedView.value!.uuid!, type, { format: responseType, query: { fields: fields.map((field) => field.title), offset, filterArrJson: JSON.stringify(filtersArr ?? nestedFilters.value), sortArrJson: JSON.stringify(sortsArr ?? sorts.value), }, headers: { 'xc-password': password.value, }, } as RequestParams) } return { sharedView, loadSharedView, meta, nestedFilters, fetchSharedViewData, fetchSharedViewGroupedData, paginationData, sorts, exportFile, formColumns, allowCSVDownload, } }