drizzle-cube
Version:
Drizzle ORM-first semantic layer with Cube.js compatibility. Type-safe analytics and dashboards with SQL injection protection.
153 lines (152 loc) • 5.78 kB
TypeScript
import { CubeQuery, FilterOperator, Filter, SimpleFilter, GroupFilter, ChartType, ChartAxisConfig, ChartDisplayConfig } from '../../types';
import { MetaResponse, QueryAnalysis, ValidationResult, DateRangeType } from '../../shared/types';
export type { MetaField, MetaCube, MetaResponse, QueryAnalysis, PrimaryCubeSelectionReason, PrimaryCubeCandidate, PrimaryCubeAnalysis, JoinPathStep, JoinPathAnalysis, PreAggregationAnalysis, QuerySummary, ValidationResult, FilterOperatorMeta, DateRangeType, DateRangeOption, TimeGranularity } from '../../shared/types';
export { FILTER_OPERATORS, DATE_RANGE_OPTIONS, TIME_GRANULARITIES } from '../../shared/types';
export type ValidationStatus = 'idle' | 'validating' | 'valid' | 'invalid';
export type ExecutionStatus = 'idle' | 'loading' | 'refreshing' | 'success' | 'error';
export type SchemaStatus = 'idle' | 'loading' | 'success' | 'error';
export interface QueryBuilderState {
query: CubeQuery;
validationStatus: ValidationStatus;
validationError: string | null;
validationSql: {
sql: string[];
params: any[];
} | null;
executionStatus: ExecutionStatus;
executionResults: any[] | null;
executionError: string | null;
totalRowCount: number | null;
totalRowCountStatus: 'idle' | 'loading' | 'success' | 'error';
resultsStale: boolean;
}
export interface ApiConfig {
baseApiUrl: string;
apiToken: string;
}
export interface QueryBuilderProps {
className?: string;
initialQuery?: CubeQuery;
disableLocalStorage?: boolean;
hideSettings?: boolean;
enableSharing?: boolean;
onShare?: (url: string) => void;
}
export interface QueryBuilderRef {
getCurrentQuery: () => CubeQuery;
getValidationState: () => {
status: ValidationStatus;
result?: ValidationResult;
};
getValidationResult: () => ValidationResult | null;
}
export type ShareButtonState = 'idle' | 'copied' | 'copied-no-chart';
export interface QueryPanelProps {
query: CubeQuery;
schema: MetaResponse | null;
validationStatus: ValidationStatus;
validationError: string | null;
validationSql: {
sql: string[];
params: any[];
} | null;
validationAnalysis?: QueryAnalysis | null;
onExecute: () => void;
onRemoveField: (fieldName: string, fieldType: 'measures' | 'dimensions' | 'timeDimensions') => void;
onTimeDimensionGranularityChange: (dimensionName: string, granularity: string) => void;
onFiltersChange: (filters: Filter[]) => void;
onDateRangeChange: (timeDimension: string, dateRange: string | string[]) => void;
onDateRangeRemove: (timeDimension: string) => void;
onOrderChange: (fieldName: string, direction: 'asc' | 'desc' | null) => void;
onClearQuery?: () => void;
showSettings?: boolean;
onSettingsClick?: () => void;
onAIAssistantClick?: () => void;
onSchemaClick?: () => void;
onShareClick?: () => void;
canShare?: boolean;
shareButtonState?: ShareButtonState;
isViewingShared?: boolean;
}
export interface AvailableFields {
dimensions: string[];
timeDimensions: string[];
measures: string[];
}
export interface ResultsPanelProps {
executionStatus: ExecutionStatus;
executionResults: any[] | null;
executionError: string | null;
resultsStale?: boolean;
query: CubeQuery;
displayLimit?: number;
onDisplayLimitChange?: (limit: number) => void;
totalRowCount?: number | null;
totalRowCountStatus?: 'idle' | 'loading' | 'success' | 'error';
chartType?: ChartType;
chartConfig?: ChartAxisConfig;
displayConfig?: ChartDisplayConfig;
availableFields?: AvailableFields | null;
onChartTypeChange?: (type: ChartType) => void;
onChartConfigChange?: (config: ChartAxisConfig) => void;
onDisplayConfigChange?: (config: ChartDisplayConfig) => void;
activeView?: 'table' | 'chart';
onActiveViewChange?: (view: 'table' | 'chart') => void;
}
export interface FilterBuilderProps {
filters: Filter[];
schema: MetaResponse | null;
query: CubeQuery;
onFiltersChange: (filters: Filter[]) => void;
hideFieldSelector?: boolean;
}
export interface FilterItemProps {
filter: SimpleFilter;
index: number;
onFilterChange: (index: number, filter: SimpleFilter) => void;
onFilterRemove: (index: number) => void;
schema: MetaResponse | null;
query: CubeQuery;
hideFieldSelector?: boolean;
hideOperatorSelector?: boolean;
hideRemoveButton?: boolean;
}
export interface FilterGroupProps {
group: GroupFilter;
index: number;
onGroupChange: (index: number, group: GroupFilter) => void;
onGroupChangeWithUnwrap?: (index: number, group: GroupFilter) => void;
onGroupRemove: (index: number) => void;
schema: MetaResponse | null;
query: CubeQuery;
depth: number;
}
export interface FilterValueSelectorProps {
fieldName: string;
operator: FilterOperator;
values: any[];
onValuesChange: (values: any[]) => void;
schema: MetaResponse | null;
}
export interface DateRangeFilter {
id: string;
timeDimension: string;
rangeType: DateRangeType;
startDate?: string;
endDate?: string;
}
export interface DateRangeSelectorProps {
timeDimensions: string[];
onDateRangeChange: (timeDimension: string, dateRange: string | string[]) => void;
onDateRangeRemove: (timeDimension: string) => void;
currentDateRanges: Record<string, string | string[]>;
}
export interface DateRangeFilterProps {
timeDimensions: Array<{
dimension: string;
granularity?: string;
dateRange?: string | string[];
}>;
onDateRangeChange: (timeDimension: string, dateRange: string | string[]) => void;
onDateRangeRemove: (timeDimension: string) => void;
}