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 4dd2dd93aff682dcc0cf31e14790668f475faeba..d71083400a29d52bbb2ab0fd1740e5f7e8effd3b 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 bc8cdcefa0c3984e99597ebd9414952acb7a93a9..78750947d02a5bfc781b3a683827f5e49a2ee43b 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 0d81213986dc9206ae36e29c6d539fa509d01d9c..082798759e863efd5ffeb9d9902e5ce94ffa168c 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; }