From 615b86c074e24c376b08412e68b620cd1aa10e49 Mon Sep 17 00:00:00 2001
From: Anton Kulyk <kuliks.anton@gmail.com>
Date: Mon, 21 Nov 2022 12:32:09 +0000
Subject: [PATCH] Add dashboard state to metabase-types/store (#26621)

* Add `DashboardState` to `metabase-types/store`

* Add `createMockDashboardState`

* Use no dashboard state by default
---
 .../src/metabase-types/store/dashboard.ts     | 60 +++++++++++++++++++
 frontend/src/metabase-types/store/index.ts    |  1 +
 .../metabase-types/store/mocks/dashboard.ts   | 28 +++++++++
 .../src/metabase-types/store/mocks/index.ts   |  1 +
 .../src/metabase-types/store/mocks/state.ts   |  2 +
 frontend/src/metabase-types/store/state.ts    |  2 +
 6 files changed, 94 insertions(+)
 create mode 100644 frontend/src/metabase-types/store/dashboard.ts
 create mode 100644 frontend/src/metabase-types/store/mocks/dashboard.ts

diff --git a/frontend/src/metabase-types/store/dashboard.ts b/frontend/src/metabase-types/store/dashboard.ts
new file mode 100644
index 00000000000..41baf765405
--- /dev/null
+++ b/frontend/src/metabase-types/store/dashboard.ts
@@ -0,0 +1,60 @@
+import type {
+  Dashboard,
+  DashboardId,
+  DashboardOrderedCard,
+  DashCardId,
+  DashCardDataMap,
+  ParameterId,
+} from "metabase-types/api";
+import { ParameterValueOrArray } from "metabase-types/types/Parameter";
+
+export type DashboardSidebarName =
+  | "addQuestion"
+  | "addActionButton"
+  | "addActionForm"
+  | "clickBehavior"
+  | "editParameter"
+  | "sharing"
+  | "info";
+
+type ParameterValueCacheKey = string;
+
+export interface DashboardState {
+  dashboardId: DashboardId | null;
+  dashboards: Record<DashboardId, Dashboard>;
+
+  dashcards: Record<DashCardId, DashboardOrderedCard>;
+  dashcardData: DashCardDataMap;
+
+  parameterValues: Record<ParameterId, ParameterValueOrArray>;
+  parameterValuesSearchCache: Record<
+    ParameterValueCacheKey,
+    {
+      has_more_values: boolean;
+      results: ParameterValueOrArray[];
+    }
+  >;
+
+  loadingDashCards: {
+    dashcardIds: DashCardId[];
+    loadingIds: DashCardId[];
+    loadingStatus: "idle" | "running" | "complete";
+    startTime: number | null;
+  };
+  loadingControls: {
+    documentTitle?: string;
+    showLoadCompleteFavicon?: boolean;
+  };
+
+  isEditing: Dashboard | null;
+  isAddParameterPopoverOpen: boolean;
+
+  slowCards: Record<DashCardId, unknown>;
+
+  sidebar: {
+    name?: DashboardSidebarName;
+    props: Record<string, unknown>;
+  };
+
+  titleTemplateChange: string | null;
+}
diff --git a/frontend/src/metabase-types/store/index.ts b/frontend/src/metabase-types/store/index.ts
index fe6a10c8255..9c88498f5ea 100644
--- a/frontend/src/metabase-types/store/index.ts
+++ b/frontend/src/metabase-types/store/index.ts
@@ -1,5 +1,6 @@
 export * from "./admin";
 export * from "./app";
+export * from "./dashboard";
 export * from "./embed";
 export * from "./entities";
 export * from "./forms";
diff --git a/frontend/src/metabase-types/store/mocks/dashboard.ts b/frontend/src/metabase-types/store/mocks/dashboard.ts
new file mode 100644
index 00000000000..a40bb9ec374
--- /dev/null
+++ b/frontend/src/metabase-types/store/mocks/dashboard.ts
@@ -0,0 +1,28 @@
+import { createMockDashboard } from "metabase-types/api/mocks";
+import type { DashboardState } from "metabase-types/store";
+
+export const createMockDashboardState = (
+  opts: Partial<DashboardState> = {},
+): DashboardState => ({
+  dashboardId: null,
+  dashboards: {},
+  dashcards: {},
+  dashcardData: {},
+  parameterValues: {},
+  parameterValuesSearchCache: {},
+  loadingDashCards: {
+    dashcardIds: [],
+    loadingIds: [],
+    loadingStatus: "idle",
+    startTime: null,
+  },
+  loadingControls: {},
+  isEditing: null,
+  isAddParameterPopoverOpen: false,
+  slowCards: {},
+  sidebar: {
+    props: {},
+  },
+  titleTemplateChange: null,
+  ...opts,
+});
diff --git a/frontend/src/metabase-types/store/mocks/index.ts b/frontend/src/metabase-types/store/mocks/index.ts
index b3215315b9a..f1aee2f690c 100644
--- a/frontend/src/metabase-types/store/mocks/index.ts
+++ b/frontend/src/metabase-types/store/mocks/index.ts
@@ -1,5 +1,6 @@
 export * from "./admin";
 export * from "./app";
+export * from "./dashboard";
 export * from "./embed";
 export * from "./entities";
 export * from "./forms";
diff --git a/frontend/src/metabase-types/store/mocks/state.ts b/frontend/src/metabase-types/store/mocks/state.ts
index e7a05e80c7c..3b1ebc433a0 100644
--- a/frontend/src/metabase-types/store/mocks/state.ts
+++ b/frontend/src/metabase-types/store/mocks/state.ts
@@ -3,6 +3,7 @@ import { createMockUser } from "metabase-types/api/mocks";
 import {
   createMockAdminState,
   createMockAppState,
+  createMockDashboardState,
   createMockEmbedState,
   createMockEntitiesState,
   createMockFormState,
@@ -15,6 +16,7 @@ export const createMockState = (opts?: Partial<State>): State => ({
   admin: createMockAdminState(),
   app: createMockAppState(),
   currentUser: createMockUser(),
+  dashboard: createMockDashboardState(),
   embed: createMockEmbedState(),
   entities: createMockEntitiesState(),
   form: createMockFormState(),
diff --git a/frontend/src/metabase-types/store/state.ts b/frontend/src/metabase-types/store/state.ts
index c0d0ee77e44..d03c1017334 100644
--- a/frontend/src/metabase-types/store/state.ts
+++ b/frontend/src/metabase-types/store/state.ts
@@ -1,6 +1,7 @@
 import { User } from "metabase-types/api";
 import { AdminState } from "./admin";
 import { AppState } from "./app";
+import { DashboardState } from "./dashboard";
 import { EmbedState } from "./embed";
 import { EntitiesState } from "./entities";
 import { FormState } from "./forms";
@@ -12,6 +13,7 @@ export interface State {
   admin: AdminState;
   app: AppState;
   currentUser: User | null;
+  dashboard: DashboardState;
   embed: EmbedState;
   entities: EntitiesState;
   form: FormState;
-- 
GitLab