From c191c47f7a133de4122202b4f00dc1c84af77534 Mon Sep 17 00:00:00 2001 From: Anton Kulyk <kuliks.anton@gmail.com> Date: Fri, 24 Jun 2022 18:10:57 +0100 Subject: [PATCH] Respect DB management permission for model caching (#23507) * Add `can-manage` property to `Database` types * Only show enable/disable caching with DB access * Rename `tooltip` which is not a tooltip anymore * Remove redundant variable --- .../ModelCacheControl/ModelCacheControl.tsx | 40 ++++++++++++++----- .../src/metabase-lib/lib/metadata/Database.ts | 3 ++ frontend/src/metabase-types/api/database.ts | 3 ++ 3 files changed, 36 insertions(+), 10 deletions(-) diff --git a/enterprise/frontend/src/metabase-enterprise/model_persistence/components/ModelCacheControl/ModelCacheControl.tsx b/enterprise/frontend/src/metabase-enterprise/model_persistence/components/ModelCacheControl/ModelCacheControl.tsx index 4dd2dd93aff..d71083400a2 100644 --- a/enterprise/frontend/src/metabase-enterprise/model_persistence/components/ModelCacheControl/ModelCacheControl.tsx +++ b/enterprise/frontend/src/metabase-enterprise/model_persistence/components/ModelCacheControl/ModelCacheControl.tsx @@ -7,6 +7,9 @@ import LoadingSpinner from "metabase/components/LoadingSpinner"; import { delay } from "metabase/lib/promise"; import { CardApi } from "metabase/services"; +import Databases from "metabase/entities/databases"; + +import Database from "metabase-lib/lib/metadata/Database"; import Question from "metabase-lib/lib/Question"; import { SpinnerContainer } from "./ModelCacheControl.styled"; @@ -17,6 +20,10 @@ interface ModelCacheControlProps { onChange?: (isPersisted: boolean) => void; } +type DatabaseEntityLoaderProps = { + database?: Database; +}; + function ModelCacheControl({ model, size, @@ -24,8 +31,7 @@ function ModelCacheControl({ ...props }: ModelCacheControlProps) { const [isLoading, setLoading] = useState(false); - const isPersisted = model.isPersisted(); - const tooltip = isPersisted ? t`Unpersist model` : t`Persist model`; + const label = model.isPersisted() ? t`Unpersist model` : t`Persist model`; const handleClick = useCallback(async () => { const id = model.id(); @@ -46,14 +52,28 @@ function ModelCacheControl({ } }, [model, onChange]); - return isLoading ? ( - <SpinnerContainer> - <LoadingSpinner size={size} /> - </SpinnerContainer> - ) : ( - <Button {...props} icon="database" onClick={handleClick} iconSize={size}> - {tooltip} - </Button> + return ( + <Databases.Loader id={model.databaseId()} loadingAndErrorWrapper={false}> + {({ database }: DatabaseEntityLoaderProps) => { + if (!database || !database["can-manage"]) { + return null; + } + return isLoading ? ( + <SpinnerContainer> + <LoadingSpinner size={size} /> + </SpinnerContainer> + ) : ( + <Button + {...props} + icon="database" + onClick={handleClick} + iconSize={size} + > + {label} + </Button> + ); + }} + </Databases.Loader> ); } diff --git a/frontend/src/metabase-lib/lib/metadata/Database.ts b/frontend/src/metabase-lib/lib/metadata/Database.ts index bc8cdcefa0c..78750947d02 100644 --- a/frontend/src/metabase-lib/lib/metadata/Database.ts +++ b/frontend/src/metabase-lib/lib/metadata/Database.ts @@ -25,6 +25,9 @@ class DatabaseInner extends Base { schemas: Schema[]; metadata: Metadata; + // Only appears in GET /api/database/:id + "can-manage"?: boolean; + // TODO Atte Keinänen 6/11/17: List all fields here (currently only in types/Database) displayName() { return this.name; diff --git a/frontend/src/metabase-types/api/database.ts b/frontend/src/metabase-types/api/database.ts index 0d81213986d..082798759e8 100644 --- a/frontend/src/metabase-types/api/database.ts +++ b/frontend/src/metabase-types/api/database.ts @@ -15,4 +15,7 @@ export interface Database { timezone?: string; native_permissions: NativePermissions; initial_sync_status: InitialSyncStatus; + + // Only appears in GET /api/database/:id + "can-manage"?: boolean; } -- GitLab