From e299928a8edd91a49af0634982658fb972d95ef1 Mon Sep 17 00:00:00 2001 From: Anton Kulyk <kuliks.anton@gmail.com> Date: Tue, 10 May 2022 13:22:21 +0100 Subject: [PATCH] Add query builder redux state types (#22536) * Add `Dataset` mock function * Add query builder redux state type * Add query builder redux state mock helper --- frontend/src/metabase-types/api/dataset.ts | 17 +++-- .../src/metabase-types/api/mocks/dataset.ts | 18 +++++ .../src/metabase-types/api/mocks/index.ts | 1 + frontend/src/metabase-types/store/index.ts | 1 + .../src/metabase-types/store/mocks/index.ts | 1 + frontend/src/metabase-types/store/mocks/qb.ts | 63 ++++++++++++++++ .../src/metabase-types/store/mocks/state.ts | 2 + frontend/src/metabase-types/store/qb.ts | 72 +++++++++++++++++++ frontend/src/metabase-types/store/state.ts | 2 + 9 files changed, 170 insertions(+), 7 deletions(-) create mode 100644 frontend/src/metabase-types/api/mocks/dataset.ts create mode 100644 frontend/src/metabase-types/store/mocks/qb.ts create mode 100644 frontend/src/metabase-types/store/qb.ts diff --git a/frontend/src/metabase-types/api/dataset.ts b/frontend/src/metabase-types/api/dataset.ts index 08bc5955c1d..ec4fb810c9b 100644 --- a/frontend/src/metabase-types/api/dataset.ts +++ b/frontend/src/metabase-types/api/dataset.ts @@ -1,3 +1,4 @@ +import { DatabaseId } from "./database"; import { DownloadPermission } from "./permissions"; export interface DatasetColumn { @@ -6,14 +7,16 @@ export interface DatasetColumn { name: string; } +export interface DatasetData { + rows: any[][]; + cols: DatasetColumn[]; + rows_truncated: number; + download_perms?: DownloadPermission; +} + export interface Dataset { - data: { - rows: any[][]; - cols: DatasetColumn[]; - rows_truncated: number; - download_perms?: DownloadPermission; - }; - database_id: number; + data: DatasetData; + database_id: DatabaseId; row_count: number; running_time: number; } diff --git a/frontend/src/metabase-types/api/mocks/dataset.ts b/frontend/src/metabase-types/api/mocks/dataset.ts new file mode 100644 index 00000000000..fabdfbf120a --- /dev/null +++ b/frontend/src/metabase-types/api/mocks/dataset.ts @@ -0,0 +1,18 @@ +import { Dataset, DatasetData } from "metabase-types/api/dataset"; + +type MockDatasetOpts = Partial<Omit<Dataset, "data">> & { + data?: Partial<DatasetData>; +}; + +export const createMockDataset = ({ data = {}, ...opts }: MockDatasetOpts) => ({ + data: { + rows: [], + cols: [{ display_name: "NAME", source: "native", name: "NAME" }], + rows_truncated: 0, + ...data, + }, + database_id: 1, + row_count: 0, + running_time: 1000, + ...opts, +}); diff --git a/frontend/src/metabase-types/api/mocks/index.ts b/frontend/src/metabase-types/api/mocks/index.ts index 59a16978f93..e26e0e465d8 100644 --- a/frontend/src/metabase-types/api/mocks/index.ts +++ b/frontend/src/metabase-types/api/mocks/index.ts @@ -3,6 +3,7 @@ export * from "./automagic-dashboards"; export * from "./collection"; export * from "./dashboard"; export * from "./database"; +export * from "./dataset"; export * from "./timeline"; export * from "./settings"; export * from "./user"; diff --git a/frontend/src/metabase-types/store/index.ts b/frontend/src/metabase-types/store/index.ts index 8400f5f703a..9a4bd5500d0 100644 --- a/frontend/src/metabase-types/store/index.ts +++ b/frontend/src/metabase-types/store/index.ts @@ -3,5 +3,6 @@ export * from "./app"; export * from "./entities"; export * from "./forms"; export * from "./settings"; +export * from "./qb"; export * from "./setup"; export * from "./state"; diff --git a/frontend/src/metabase-types/store/mocks/index.ts b/frontend/src/metabase-types/store/mocks/index.ts index 8400f5f703a..01343301932 100644 --- a/frontend/src/metabase-types/store/mocks/index.ts +++ b/frontend/src/metabase-types/store/mocks/index.ts @@ -2,6 +2,7 @@ export * from "./admin"; export * from "./app"; export * from "./entities"; export * from "./forms"; +export * from "./qb"; export * from "./settings"; export * from "./setup"; export * from "./state"; diff --git a/frontend/src/metabase-types/store/mocks/qb.ts b/frontend/src/metabase-types/store/mocks/qb.ts new file mode 100644 index 00000000000..656a09562c7 --- /dev/null +++ b/frontend/src/metabase-types/store/mocks/qb.ts @@ -0,0 +1,63 @@ +import { + QueryBuilderState, + QueryBuilderUIControls, +} from "metabase-types/store"; + +export const createMockQueryBuilderUIControlsState = ( + opts?: Partial<QueryBuilderUIControls>, +): QueryBuilderUIControls => ({ + isShowingDataReference: false, + isShowingTemplateTagsEditor: false, + isShowingNewbModal: false, + isEditing: false, + isRunning: false, + isQueryComplete: false, + isShowingSummarySidebar: false, + isShowingFilterSidebar: false, + isShowingChartTypeSidebar: false, + isShowingChartSettingsSidebar: false, + isShowingQuestionDetailsSidebar: false, + isShowingTimelineSidebar: false, + initialChartSetting: null, + isPreviewing: true, + isShowingRawTable: false, + queryBuilderMode: "view", + previousQueryBuilderMode: false, + snippetCollectionId: null, + datasetEditorTab: "query", + ...opts, +}); + +export const createMockQueryBuilderState = ( + opts?: Partial<QueryBuilderState>, +): QueryBuilderState => ({ + uiControls: createMockQueryBuilderUIControlsState(), + loadingControls: { + showLoadCompleteFavicon: false, + documentTitle: "", + timeoutId: "", + }, + + queryStatus: "complete", + queryResults: null, + queryStartTime: null, + cancelQueryDeferred: null, + + card: null, + originalCard: null, + lastRunCard: null, + + parameterValues: {}, + + zoomedRowObjectId: null, + tableForeignKeyReferences: null, + + visibleTimelineIds: [], + selectedTimelineEventIds: [], + + metadataDiff: {}, + + currentState: null, + + ...opts, +}); diff --git a/frontend/src/metabase-types/store/mocks/state.ts b/frontend/src/metabase-types/store/mocks/state.ts index 73746b2db73..5b80c6d644c 100644 --- a/frontend/src/metabase-types/store/mocks/state.ts +++ b/frontend/src/metabase-types/store/mocks/state.ts @@ -5,6 +5,7 @@ import { createMockAppState, createMockSettingsState, createMockEntitiesState, + createMockQueryBuilderState, createMockSetupState, createMockFormState, } from "metabase-types/store/mocks"; @@ -15,6 +16,7 @@ export const createMockState = (opts?: Partial<State>): State => ({ currentUser: createMockUser(), entities: createMockEntitiesState(), form: createMockFormState(), + qb: createMockQueryBuilderState(), settings: createMockSettingsState(), setup: createMockSetupState(), ...opts, diff --git a/frontend/src/metabase-types/store/qb.ts b/frontend/src/metabase-types/store/qb.ts new file mode 100644 index 00000000000..739d63f3f70 --- /dev/null +++ b/frontend/src/metabase-types/store/qb.ts @@ -0,0 +1,72 @@ +import { Dataset } from "metabase-types/api/dataset"; + +import { Card } from "metabase-types/types/Card"; +import { Field } from "metabase-types/types/Field"; +import { ParameterValueOrArray } from "metabase-types/types/Parameter"; + +export type QueryBuilderMode = "view" | "notebook" | "dataset"; +export type DatasetEditorTab = "query" | "metadata"; +export type QueryBuilderQueryStatus = "idle" | "running" | "complete"; + +export type ForeignKeyReference = { + status: number; + value: number; +}; + +export interface QueryBuilderUIControls { + isShowingDataReference: boolean; + isShowingTemplateTagsEditor: boolean; + isShowingNewbModal: boolean; + isEditing: boolean; + isRunning: boolean; + isQueryComplete: boolean; + isShowingSummarySidebar: boolean; + isShowingFilterSidebar: boolean; + isShowingChartTypeSidebar: boolean; + isShowingChartSettingsSidebar: boolean; + isShowingQuestionDetailsSidebar: boolean; + isShowingTimelineSidebar: boolean; + initialChartSetting: null; + isPreviewing: boolean; + isShowingRawTable: boolean; + queryBuilderMode: QueryBuilderMode; + previousQueryBuilderMode: boolean; + snippetCollectionId: number | null; + datasetEditorTab: DatasetEditorTab; +} + +export interface QueryBuilderLoadingControls { + showLoadCompleteFavicon: boolean; + documentTitle: string; + timeoutId: string; +} + +export interface QueryBuilderState { + uiControls: QueryBuilderUIControls; + + loadingControls: QueryBuilderLoadingControls; + queryStatus: QueryBuilderQueryStatus; + queryResults: Dataset[] | null; + queryStartTime: number | null; + cancelQueryDeferred: Promise<void> | null; + + card: Card | null; + originalCard: Card | null; + lastRunCard: Card | null; + + parameterValues: Record<string, ParameterValueOrArray>; + + zoomedRowObjectId: number | string | null; + tableForeignKeyReferences: Record<number, ForeignKeyReference> | null; + + visibleTimelineIds: number[]; + selectedTimelineEventIds: number[]; + + metadataDiff: Record<string, Partial<Field>>; + + currentState: { + card: Card; + cardId?: number; + serializedCard: string; + } | null; +} diff --git a/frontend/src/metabase-types/store/state.ts b/frontend/src/metabase-types/store/state.ts index 7875873e762..dc079ead7c0 100644 --- a/frontend/src/metabase-types/store/state.ts +++ b/frontend/src/metabase-types/store/state.ts @@ -3,6 +3,7 @@ import { AdminState } from "./admin"; import { AppState } from "./app"; import { EntitiesState } from "./entities"; import { FormState } from "./forms"; +import { QueryBuilderState } from "./qb"; import { SettingsState } from "./settings"; import { SetupState } from "./setup"; @@ -12,6 +13,7 @@ export interface State { currentUser: User; entities: EntitiesState; form: FormState; + qb: QueryBuilderState; settings: SettingsState; setup: SetupState; } -- GitLab