{"version":3,"file":"index.cjs","sources":["../../../../components/data-view/utils/index.tsx"],"sourcesContent":["import type { ColumnDef, Row, Table } from '@tanstack/react-table';\nimport {\n  getFilteredRowModel,\n  type RowModel,\n  TableState\n} from '@tanstack/table-core';\nimport dayjs from 'dayjs';\n\nimport { FilterOperatorTypes, FilterType } from '~/types/filters';\nimport {\n  DataViewField,\n  DataViewQuery,\n  DataViewSort,\n  defaultGroupOption,\n  GroupByResolver,\n  GroupedData,\n  InternalFilter,\n  InternalQuery,\n  SortOrders\n} from '../data-view.types';\nimport {\n  getFilterFn,\n  getFilterOperator,\n  getFilterValue\n} from './filter-operations';\nimport { orderBucketKeys } from './order-bucket-keys';\n\nexport function queryToTableState(query: InternalQuery): Partial<TableState> {\n  const columnFilters =\n    query.filters\n      ?.filter(data => {\n        if (data._type === FilterType.date) return dayjs(data.value).isValid();\n        if (data.value !== '') return true;\n        return false;\n      })\n      ?.map(data => {\n        const valueObject =\n          data._type === FilterType.date\n            ? { date: data.value }\n            : { value: data.value };\n        return { value: valueObject, id: data?.name };\n      }) || [];\n\n  const sorting = query.sort?.map(data => ({\n    id: data?.name,\n    desc: data?.order === SortOrders.DESC\n  }));\n  return {\n    columnFilters,\n    sorting,\n    globalFilter: query.search\n  };\n}\n\n/**\n * Convert field metadata to TanStack ColumnDefs. These carry filter/sort/group/\n * visibility capability and the filter predicate. The `header` falls back to\n * `field.label` so renderers that bypass their column spec still get the right\n * default header text.\n */\nexport function fieldsToColumnDefs<TData>(\n  fields: DataViewField<TData>[] = [],\n  filters: InternalFilter[] = []\n): ColumnDef<TData>[] {\n  return fields.map(field => {\n    const colFilter = filters?.find(f => f.name === field.accessorKey);\n    const filterFn = colFilter?.operator\n      ? getFilterFn(field.filterType || FilterType.string, colFilter.operator)\n      : undefined;\n\n    return {\n      id: field.accessorKey,\n      accessorKey: field.accessorKey,\n      header: field.label,\n      enableColumnFilter: field.filterable ?? false,\n      enableSorting: field.sortable ?? false,\n      enableGrouping: field.groupable ?? false,\n      enableHiding: field.hideable ?? false,\n      filterFn\n    } as ColumnDef<TData>;\n  });\n}\n\n/**\n * Bucket data into `GroupedData` entries keyed by `group_by`. When a resolver\n * is supplied for that key, the resolver runs per-row; otherwise the field is\n * accessed directly. Used in client mode only.\n *\n * Sections come out in the field's `groupOrder` where it declares one, with\n * undeclared values following in first-seen order and the null-valued bucket\n * last — see `orderBucketKeys`.\n */\nexport function groupData<TData>(\n  data: TData[],\n  group_by?: string,\n  fields: DataViewField<TData>[] = [],\n  resolvers: Record<string, GroupByResolver<TData>> = {}\n): GroupedData<TData>[] {\n  if (!data) return [];\n  if (!group_by || group_by === defaultGroupOption.id)\n    return data as GroupedData<TData>[];\n\n  const resolver = resolvers[group_by];\n\n  const groupMap = new Map<string, TData[]>();\n  data.forEach(currentData => {\n    const keyValue = resolver\n      ? resolver(currentData)\n      : ((currentData as Record<string, unknown>)[group_by] as string);\n    const bucketKey = keyValue == null ? '' : String(keyValue);\n    if (!groupMap.has(bucketKey)) groupMap.set(bucketKey, []);\n    groupMap.get(bucketKey)?.push(currentData);\n  });\n\n  const field = fields.find(f => f.accessorKey === group_by);\n  const showGroupCount = field?.showGroupCount || false;\n  const groupLabelsMap = field?.groupLabelsMap || {};\n  const groupCountMap = field?.groupCountMap || {};\n  const groupedData: GroupedData<TData>[] = [];\n\n  // Section order: the field's declared `groupOrder` first, then undeclared\n  // values in first-seen order, then the empty (null-valued) bucket last.\n  for (const key of orderBucketKeys([...groupMap.keys()], field?.groupOrder)) {\n    const value = groupMap.get(key) as TData[];\n    groupedData.push({\n      label: groupLabelsMap[key] || key,\n      group_key: key,\n      subRows: value,\n      count: groupCountMap[key] ?? value.length,\n      showGroupCount\n    });\n  }\n\n  return groupedData;\n}\n\nexport const GROUP_ROW_ID_PREFIX = '__group__:';\n\nexport function isGroupRowData<TData>(row: unknown): row is GroupedData<TData> {\n  if (!row || typeof row !== 'object') return false;\n  const candidate = row as GroupedData<TData>;\n  return (\n    Array.isArray(candidate.subRows) && typeof candidate.group_key === 'string'\n  );\n}\n\n/**\n * Keys group buckets by `group_key` so their ids can't collide with data row\n * ids. Leaves delegate to `getRowId`, falling back to TanStack's positional\n * default (which supplying any resolver would otherwise replace).\n */\nexport function createRowIdResolver<TData>(\n  getRowId?: (row: TData, index: number) => string\n) {\n  return (row: TData, index: number, parent?: Row<TData>): string => {\n    if (isGroupRowData<TData>(row)) {\n      return `${GROUP_ROW_ID_PREFIX}${row.group_key}`;\n    }\n    if (getRowId) return getRowId(row, index);\n    return parent ? `${parent.id}.${index}` : String(index);\n  };\n}\n\nconst generateFilterMap = (\n  filters: InternalFilter[] = []\n): Map<string, any> => {\n  return new Map(\n    filters\n      ?.filter(data => data._type === FilterType.select || data.value !== '')\n      .map(({ name, operator, value }) => [`${name}-${operator}`, value])\n  );\n};\n\nconst generateSortMap = (sort: DataViewSort[] = []): Map<string, string> => {\n  return new Map(sort.map(({ name, order }) => [name, order]));\n};\n\nconst isFilterChanged = (\n  oldFilters: InternalFilter[] = [],\n  newFilters: InternalFilter[] = []\n): boolean => {\n  const oldFilterMap = generateFilterMap(oldFilters);\n  const newFilterMap = generateFilterMap(newFilters);\n  if (oldFilterMap.size !== newFilterMap.size) return true;\n  return [...newFilterMap].some(\n    ([key, value]) => oldFilterMap.get(key) !== value\n  );\n};\n\nconst isSortChanged = (\n  oldSort: DataViewSort[] = [],\n  newSort: DataViewSort[] = []\n): boolean => {\n  if (oldSort.length !== newSort.length) return true;\n  const oldSortMap = generateSortMap(oldSort);\n  const newSortMap = generateSortMap(newSort);\n  return [...newSortMap].some(([key, order]) => oldSortMap.get(key) !== order);\n};\n\nconst isGroupChanged = (\n  oldGroupBy: string[] = [],\n  newGroupBy: string[] = []\n): boolean => {\n  if (oldGroupBy.length !== newGroupBy.length) return true;\n  const oldGroupSet = new Set(oldGroupBy);\n  return newGroupBy.some(item => !oldGroupSet.has(item));\n};\n\nconst isSearchChanged = (oldSearch?: string, newSearch?: string): boolean =>\n  oldSearch !== newSearch;\n\n/**\n * True when there's an active filter, search, or sort/group differing from the\n * declared defaults. Used to distinguish zero state from empty state.\n */\nexport const hasActiveQuery = (\n  tableQuery: InternalQuery,\n  defaultSort: DataViewSort\n): boolean => {\n  const hasFilters =\n    (tableQuery?.filters && tableQuery.filters.length > 0) || false;\n  const hasSearch = Boolean(\n    tableQuery?.search && tableQuery.search.trim() !== ''\n  );\n  const sortChanged = isSortChanged([defaultSort], tableQuery.sort || []);\n  const groupChanged = isGroupChanged(\n    [defaultGroupOption.id],\n    tableQuery.group_by || []\n  );\n  return hasFilters || hasSearch || sortChanged || groupChanged;\n};\n\nexport const hasQueryChanged = (\n  oldQuery: InternalQuery | null,\n  newQuery: InternalQuery\n): boolean => {\n  if (!oldQuery) return true;\n  return (\n    isFilterChanged(oldQuery.filters, newQuery.filters) ||\n    isSortChanged(oldQuery.sort, newQuery.sort) ||\n    isGroupChanged(oldQuery.group_by, newQuery.group_by) ||\n    isSearchChanged(oldQuery.search, newQuery.search)\n  );\n};\n\nexport function getInitialColumnVisibility<TData>(\n  fields: DataViewField<TData>[] = []\n): Record<string, boolean> {\n  return fields.reduce<Record<string, boolean>>((acc, field) => {\n    acc[field.accessorKey] = field.defaultHidden ? false : true;\n    return acc;\n  }, {});\n}\n\nexport function transformToDataViewQuery(query: InternalQuery): DataViewQuery {\n  const { group_by = [], filters = [], sort = [], ...rest } = query;\n  const sanitizedGroupBy = group_by?.filter(\n    key => key !== defaultGroupOption.id\n  );\n\n  const sanitizedFilters =\n    filters\n      ?.filter(data => {\n        if (data._type === FilterType.select) return true;\n        if (data._type === FilterType.date) return dayjs(data.value).isValid();\n        if (data.value !== '') return true;\n        return false;\n      })\n      ?.map(data => ({\n        name: data.name,\n        operator: getFilterOperator({\n          operator: data.operator,\n          value: data.value,\n          filterType: data._type\n        }),\n        ...getFilterValue({\n          value: data.value,\n          filterType: data._type,\n          dataType: data._dataType,\n          operator: data.operator\n        })\n      })) || [];\n\n  return {\n    ...rest,\n    sort,\n    group_by: sanitizedGroupBy,\n    filters: sanitizedFilters\n  };\n}\n\n/**\n * Reverse of `transformToDataViewQuery`. The UI re-applies type information\n * from field metadata once it sees a column, since the wire format strips it.\n */\nexport function dataViewQueryToInternal(query: DataViewQuery): InternalQuery {\n  const { filters, ...rest } = query;\n  if (!filters) return rest;\n\n  const internalFilters: InternalFilter[] = filters.map(filter => {\n    const {\n      operator,\n      value,\n      stringValue,\n      numberValue,\n      boolValue,\n      ...filterRest\n    } = filter;\n\n    let transformedFilter = {\n      operator: operator as FilterOperatorTypes,\n      value,\n      ...(stringValue !== undefined && { stringValue }),\n      ...(numberValue !== undefined && { numberValue }),\n      ...(boolValue !== undefined && { boolValue })\n    };\n\n    if (operator === 'ilike' && stringValue) {\n      if (stringValue.startsWith('%') && stringValue.endsWith('%')) {\n        transformedFilter = {\n          operator: 'contains',\n          value: stringValue.slice(1, -1)\n        };\n      } else if (stringValue.endsWith('%')) {\n        transformedFilter = {\n          operator: 'starts_with',\n          value: stringValue.slice(0, -1)\n        };\n      } else if (stringValue.startsWith('%')) {\n        transformedFilter = {\n          operator: 'ends_with',\n          value: stringValue.slice(1)\n        };\n      } else {\n        transformedFilter = { operator: 'contains', value: stringValue };\n      }\n    }\n\n    return {\n      ...filterRest,\n      ...transformedFilter,\n      _type: undefined,\n      _dataType: undefined\n    } as InternalFilter;\n  });\n\n  return { ...rest, filters: internalFilters };\n}\n\n/**\n * `getFilteredRowModel` with `flatRows` backfilled. table-core's\n * `filterFromLeafRows` path never fills that array, which kills every API\n * reading it (`getIsAllRowsSelected`, `toggleAllRowsSelected`, …) while a\n * filter is active. Filled in place to preserve the model identity downstream\n * memos key on.\n */\nexport function getFilteredRowModelWithFlatRows<TData>(): (\n  table: Table<TData>\n) => () => RowModel<TData> {\n  const base = getFilteredRowModel<TData>();\n  return table => {\n    const getModel = base(table);\n    return () => {\n      const model = getModel();\n      if (model.flatRows.length > 0) return model;\n      const collect = (rows: Row<TData>[]) => {\n        rows.forEach(row => {\n          model.flatRows.push(row);\n          if (row.subRows?.length) collect(row.subRows);\n        });\n      };\n      collect(model.rows);\n      return model;\n    };\n  };\n}\n\n/** Leaf count from the row tree. Kept recursive so it stays correct for the grouped tree, where `flatRows` also counts group rows. */\nexport function countLeafRows<T>(rows: Row<T>[]): number {\n  return rows.reduce(\n    (n, row) => n + (row.subRows?.length ? countLeafRows(row.subRows) : 1),\n    0\n  );\n}\n\n/** Difference between pre- and post-filter leaf rows (client mode only). */\nexport function getClientHiddenLeafRowCount<T>(table: Table<T>): number {\n  const pre = table.getPreFilteredRowModel();\n  const post = table.getFilteredRowModel();\n  return Math.max(0, countLeafRows(pre.rows) - countLeafRows(post.rows));\n}\n\nexport function hasActiveTableFiltering<T>(table: Table<T>): boolean {\n  const state = table.getState();\n  if (state.columnFilters?.length > 0) return true;\n  const gf = state.globalFilter;\n  if (gf === undefined || gf === null) return false;\n  return String(gf).trim() !== '';\n}\n\nexport function getDefaultTableQuery(\n  defaultSort: DataViewSort,\n  oldQuery: DataViewQuery = {}\n): InternalQuery {\n  const internalQuery = dataViewQueryToInternal(oldQuery);\n  return {\n    sort: [defaultSort],\n    group_by: [defaultGroupOption.id],\n    ...internalQuery\n  };\n}\n"],"names":["FilterType","SortOrders","filters","getFilterFn","defaultGroupOption","orderBucketKeys","getFilterOperator","getFilterValue","getFilteredRowModel"],"mappings":"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"}