Tulip Logo IconTulip
Local Provider

Queries and Filters

The local provider supports paginated tree and flat listings with provider-aware filters.

The local provider builds on Tulip query patterns.

Important query concepts

  • namespace
  • parentId
  • search
  • sorting
  • pagination: { page, limit }
  • archive state filtering

Practical guidance

  • use tree listing for file-manager screens
  • use flat listing for cross-folder browsing or global search
  • keep query state in URL params when you want shareable views

Filter descriptors

Drive filters use the same descriptor API as core query.

import {
  arrayFilter,
  booleanFilter,
  defineFilters,
  enumFilter,
  stringFilter,
} from "@tulip-systems/query";

const driveNodeTypes = ["file", "folder"] as const;

export const driveTreeFilters = defineFilters({
  types: arrayFilter(enumFilter(driveNodeTypes)).build((value) =>
    value?.length ? { field: "type", operator: "in", value } : null,
  ),
  contentTypes: arrayFilter(stringFilter).build((value) =>
    value?.length ? { field: "contentType", operator: "in", value } : null,
  ),
  nodeIds: arrayFilter(stringFilter).build((value) =>
    value?.length ? { field: "id", operator: "in", value } : null,
  ),
  isArchived: booleanFilter.build((value) =>
    value === undefined ? null : { field: "isArchived", operator: "eq", value },
  ),
});

Provider-specific filters can extend the shared tree filters:

const localNodeSubtypes = ["image", "video", "document"] as const;

export const localDriveFilters = defineFilters({
  ...driveTreeFilters,
  subtypes: arrayFilter(enumFilter(localNodeSubtypes)).build((value) =>
    value?.length ? { field: "subtype", operator: "in", value } : null,
  ),
  hidden: booleanFilter.build((value) =>
    value === undefined ? null : { field: "hidden", operator: "eq", value },
  ),
});

The local provider compiles these portable filter conditions into provider-aware TanStack DB or server query predicates.

On this page