From 187d1f28f5421cf1b7b97f81f711ded45deafc13 Mon Sep 17 00:00:00 2001 From: Fran McDade Date: Fri, 11 Aug 2023 16:36:02 +1000 Subject: [PATCH] feat: prevent dataset export if not authorized (#898) (#3610) * feat: prevent dataset export if not authorized (#898) * fix: component config import from package (#898) --------- Co-authored-by: Fran McDade --- explorer/app/components/index.tsx | 1 + .../anvil-cmg/common/viewModelBuilders.ts | 49 +++++++++++++ .../dev/detail/dataset/exportMainColumn.ts | 68 ++++++++++++++++++- .../dev/detail/dataset/exportSideColumn.ts | 33 --------- .../dev/index/datasetsEntityConfig.ts | 2 - .../anvil-cmg/dev/listView/listHero.ts | 2 +- 6 files changed, 116 insertions(+), 39 deletions(-) delete mode 100644 explorer/site-config/anvil-cmg/dev/detail/dataset/exportSideColumn.ts diff --git a/explorer/app/components/index.tsx b/explorer/app/components/index.tsx index 39f22cf4f..d76ce2253 100644 --- a/explorer/app/components/index.tsx +++ b/explorer/app/components/index.tsx @@ -23,6 +23,7 @@ export { Stack } from "@clevercanary/data-explorer-ui/lib/components/common/Stac export { StaticImage } from "@clevercanary/data-explorer-ui/lib/components/common/StaticImage/staticImage"; export { StatusBadge } from "@clevercanary/data-explorer-ui/lib/components/common/StatusBadge/statusBadge"; export { TagWarning } from "@clevercanary/data-explorer-ui/lib/components/common/Tag/tag.styles"; +export { ConditionalComponent } from "@clevercanary/data-explorer-ui/lib/components/ComponentCreator/components/ConditionalComponent/conditionalComponent"; export { DetailViewTable } from "@clevercanary/data-explorer-ui/lib/components/Detail/components/DetailViewTable/detailViewTable"; export { DownloadCurlCommandForm } from "@clevercanary/data-explorer-ui/lib/components/Export/components/DownloadCurlCommand/components/DownloadCurlCommandForm/downloadCurlCommandForm"; export { DownloadCurlCommand } from "@clevercanary/data-explorer-ui/lib/components/Export/components/DownloadCurlCommand/downloadCurlCommand"; diff --git a/explorer/app/viewModelBuilders/azul/anvil-cmg/common/viewModelBuilders.ts b/explorer/app/viewModelBuilders/azul/anvil-cmg/common/viewModelBuilders.ts index 5d372d3a5..7992bf6a1 100644 --- a/explorer/app/viewModelBuilders/azul/anvil-cmg/common/viewModelBuilders.ts +++ b/explorer/app/viewModelBuilders/azul/anvil-cmg/common/viewModelBuilders.ts @@ -379,6 +379,29 @@ export const buildExportEntityToTerra = ( }; }; +/** + * Build props for entity related export warning FluidAlert component. + * @param datasetsResponse - Response model return from datasets API (unused). + * @param viewContext - View context. + * @returns model to be used as props for the FluidAlert component. + */ +export const buildExportEntityWarning = ( + datasetsResponse: DatasetsResponse, + viewContext: ViewContext +): React.ComponentProps => { + const { + authState: { isAuthorized }, + } = viewContext; + const title = isAuthorized + ? "To export this dataset, please request access." + : "To export this dataset, please sign in and, if necessary, request access."; + return { + severity: "warning", + title, + variant: "banner", + }; +}; + /** * Build props for export Hero component. * @param _ - Unused. @@ -804,6 +827,32 @@ function mapCurrentQuery( ]; } +/** + * Renders entity related export when the given datasests response is accessible. + * @param datasetsResponse - Response model return from datasets API. + * @returns model to be used as props for the ConditionalComponent component. + */ +export const renderExportEntity = ( + datasetsResponse: DatasetsResponse +): React.ComponentProps => { + return { + isIn: isDatasetAccessible(datasetsResponse), + }; +}; + +/** + * Renders entity related export warning when the given datasests response is not accessible. + * @param datasetsResponse - Response model return from datasets API. + * @returns model to be used as props for the ConditionalComponent component. + */ +export const renderExportEntityWarning = ( + datasetsResponse: DatasetsResponse +): React.ComponentProps => { + return { + isIn: !isDatasetAccessible(datasetsResponse), + }; +}; + /** * Returns value from a string array matching the given index. * @param arr - String array. diff --git a/explorer/site-config/anvil-cmg/dev/detail/dataset/exportMainColumn.ts b/explorer/site-config/anvil-cmg/dev/detail/dataset/exportMainColumn.ts index 841a65308..cb3ecd0a3 100644 --- a/explorer/site-config/anvil-cmg/dev/detail/dataset/exportMainColumn.ts +++ b/explorer/site-config/anvil-cmg/dev/detail/dataset/exportMainColumn.ts @@ -1,11 +1,73 @@ import { ComponentConfig } from "@clevercanary/data-explorer-ui/lib/config/entities"; import { DatasetsResponse } from "../../../../../app/apis/azul/anvil-cmg/common/responses"; import * as C from "../../../../../app/components"; +import * as MDX from "../../../../../app/content/anvil-cmg"; import * as V from "../../../../../app/viewModelBuilders/azul/anvil-cmg/common/viewModelBuilders"; export const mainColumn: ComponentConfig[] = [ { - component: C.ExportToTerra, - viewBuilder: V.buildExportEntityToTerra, - } as ComponentConfig, + /* Dataset is not accessible; render warning */ + children: [ + { + children: [ + { + component: C.FluidAlert, + viewBuilder: V.buildExportEntityWarning, + } as ComponentConfig, + ], + component: C.BackPageContentSingleColumn, + } as ComponentConfig, + ], + component: C.ConditionalComponent, + viewBuilder: V.renderExportEntityWarning, + } as ComponentConfig, + { + /* Dataset is accessible; render export entity */ + children: [ + /* mainColumn */ + { + children: [ + { + component: C.ExportToTerra, + viewBuilder: V.buildExportEntityToTerra, + } as ComponentConfig, + ], + component: C.BackPageContentMainColumn, + } as ComponentConfig, + /* sideColumn */ + { + children: [ + { + children: [ + { + component: C.ExportCurrentQuery, + viewBuilder: V.buildExportCurrentQuery, + } as ComponentConfig, + { + component: C.ExportSelectedDataSummary, + viewBuilder: V.buildExportSelectedDataSummary, + } as ComponentConfig, + ], + component: C.ExportSummary, + } as ComponentConfig, + { + children: [ + { + children: [ + { + component: MDX.DataReleasePolicy, + } as ComponentConfig, + ], + component: MDX.Section, + } as ComponentConfig, + ], + component: C.FluidPaper, + } as ComponentConfig, + ], + component: C.BackPageContentSideColumn, + } as ComponentConfig, + ], + component: C.ConditionalComponent, + viewBuilder: V.renderExportEntity, + } as ComponentConfig, ]; diff --git a/explorer/site-config/anvil-cmg/dev/detail/dataset/exportSideColumn.ts b/explorer/site-config/anvil-cmg/dev/detail/dataset/exportSideColumn.ts deleted file mode 100644 index ef6330a2a..000000000 --- a/explorer/site-config/anvil-cmg/dev/detail/dataset/exportSideColumn.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { ComponentConfig } from "@clevercanary/data-explorer-ui/lib/config/entities"; -import * as C from "../../../../../app/components"; -import * as MDX from "../../../../../app/content/anvil-cmg"; -import * as V from "../../../../../app/viewModelBuilders/azul/anvil-cmg/common/viewModelBuilders"; - -export const sideColumn: ComponentConfig[] = [ - { - children: [ - { - component: C.ExportCurrentQuery, - viewBuilder: V.buildExportCurrentQuery, - } as ComponentConfig, - { - component: C.ExportSelectedDataSummary, - viewBuilder: V.buildExportSelectedDataSummary, - } as ComponentConfig, - ], - component: C.ExportSummary, - } as ComponentConfig, - { - children: [ - { - children: [ - { - component: MDX.DataReleasePolicy, - } as ComponentConfig, - ], - component: MDX.Section, - } as ComponentConfig, - ], - component: C.FluidPaper, - } as ComponentConfig, -]; diff --git a/explorer/site-config/anvil-cmg/dev/index/datasetsEntityConfig.ts b/explorer/site-config/anvil-cmg/dev/index/datasetsEntityConfig.ts index f238a4bfe..5d2b45ef0 100644 --- a/explorer/site-config/anvil-cmg/dev/index/datasetsEntityConfig.ts +++ b/explorer/site-config/anvil-cmg/dev/index/datasetsEntityConfig.ts @@ -13,7 +13,6 @@ import { ANVIL_CMG_CATEGORY_LABEL, } from "../../category"; import { mainColumn as exportMainColumn } from "../detail/dataset/exportMainColumn"; -import { sideColumn as exportSideColumn } from "../detail/dataset/exportSideColumn"; import { mainColumn } from "../detail/dataset/overviewMainColumn"; import { sideColumn } from "../detail/dataset/overviewSideColumn"; import { top } from "../detail/dataset/top"; @@ -37,7 +36,6 @@ export const datasetsEntityConfig: EntityConfig = { label: "Export", mainColumn: exportMainColumn, route: "export-to-terra", - sideColumn: exportSideColumn, }, ], top: top, diff --git a/explorer/site-config/anvil-cmg/dev/listView/listHero.ts b/explorer/site-config/anvil-cmg/dev/listView/listHero.ts index 7904da4db..f7865cf04 100644 --- a/explorer/site-config/anvil-cmg/dev/listView/listHero.ts +++ b/explorer/site-config/anvil-cmg/dev/listView/listHero.ts @@ -1,7 +1,7 @@ import { ComponentConfig, ComponentsConfig, -} from "../../../../../../data-explorer/packages/data-explorer-ui/src/config/entities"; +} from "@clevercanary/data-explorer-ui/lib/config/entities"; import * as C from "../../../../app/components"; import * as T from "../../../../app/viewModelBuilders/azul/anvil-cmg/common/viewModelBuilders";