Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Esas/disable powerbi component prod 13567 #875

Merged
merged 5 commits into from
Jul 17, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions cypress/commons/actions/generic/Dashboards.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
// Copyright (c) Cosmo Tech.
// Licensed under the MIT license.
import { GENERIC_SELECTORS } from '../../constants/generic/IdConstants';

export const getDashboardsTab = (timeout = 5) => {
return cy.get(GENERIC_SELECTORS.dashboards.tabName, { timeout: timeout * 1000 });
};
3 changes: 3 additions & 0 deletions cypress/commons/constants/generic/IdConstants.js
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,9 @@ export const GENERIC_SELECTORS = {
cytovizElementAttributeName: '[data-cy="cytoviz-element-attribute-name"]',
cytovizElementAttributeValue: '[data-cy="cytoviz-element-attribute-value"]',
},
dashboards: {
tabName: '[data-cy="tabs.dashboards.key"]',
},
scenario: {
view: '[data-cy=scenario-view]',
tabName: '[data-cy="tabs.scenario.key"]',
Expand Down
6 changes: 4 additions & 2 deletions cypress/commons/utils/apiUtils.js
Original file line number Diff line number Diff line change
Expand Up @@ -742,8 +742,10 @@ const interceptWorkspaceSelectorQueries = () => {
];
};

const interceptSelectWorkspaceQueries = () => {
return [interceptPowerBIAzureFunction(), interceptGetSolution(), interceptGetScenarios()];
const interceptSelectWorkspaceQueries = (isPowerBiEnabled = true) => {
const workspaceQueries = [interceptGetSolution(), interceptGetScenarios()];
if (isPowerBiEnabled) workspaceQueries.push(interceptPowerBIAzureFunction());
return workspaceQueries;
};

export const apiUtils = {
Expand Down
6 changes: 3 additions & 3 deletions cypress/commons/utils/routeUtils.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,9 @@ const _navigateTo = (url) => {
});
};

const getBrowseQueries = (workspaceId, scenarioId) => {
const getBrowseQueries = (workspaceId, scenarioId, isPowerBiEnabled) => {
const queries = api.interceptWorkspaceSelectorQueries();
if (workspaceId) queries.push(...api.interceptSelectWorkspaceQueries());
if (workspaceId) queries.push(...api.interceptSelectWorkspaceQueries(isPowerBiEnabled));
if (scenarioId) queries.push(api.interceptGetScenario(scenarioId));
return queries;
};
Expand Down Expand Up @@ -55,7 +55,7 @@ const browse = (options) => {
: options.url?.match(WEBAPP_URL_REGEX.SCENARIO_ID_PATTERN)?.[1];

// Intercept scenario only when explicitly specified in options (part 2 of WorkingInTwoWorkspaces)
const queries = getBrowseQueries(workspaceId, options.scenarioId);
const queries = getBrowseQueries(workspaceId, options.scenarioId, options.isPowerBiEnabled);
_navigateTo(options.url);
if (options.onBrowseCallback) options.onBrowseCallback();
waitBrowseQueries(queries);
Expand Down
45 changes: 45 additions & 0 deletions cypress/e2e/brewery/ResultsDashboards-DisplayDisabled.cy.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
// Copyright (c) Cosmo Tech.
// Licensed under the MIT license.
import { Login, ScenarioParameters, Scenarios } from '../../commons/actions';
import { getDashboardsTab } from '../../commons/actions/generic/Dashboards';
import { stub } from '../../commons/services/stubbing';
import { WORKSPACE_WITHOUT_DASHBOARDS } from '../../fixtures/stubbing/ScenarioViewDashboard/workspace';
import { DEFAULT_SCENARIOS_LIST } from '../../fixtures/stubbing/default';

const { id: scenarioId } = DEFAULT_SCENARIOS_LIST[0];
const runOptions = {
runDuration: 1000,
dataIngestionDuration: 1000,
finalStatus: 'Successful',
expectedPollsCount: 2,
};

describe('results display is disabled', () => {
before(() => {
stub.start();
stub.setWorkspaces([WORKSPACE_WITHOUT_DASHBOARDS]);
});

beforeEach(() => {
Login.login({
isPowerBiEnabled: false,
});
});

after(() => {
stub.stop();
});

it('can launch a scenario and show Display of results is disabled dashboard', () => {
getDashboardsTab().should('not.exist');
ScenarioParameters.launch({ scenarioId, runOptions, saveAndLaunch: true });
ScenarioParameters.waitForScenarioRunEnd();
Scenarios.getDashboardAccordionLogsDownloadButton().should('be.visible');
Scenarios.getDashboardAccordion().click();
Scenarios.getDashboardPlaceholder().should('be.visible');
Scenarios.getDashboardPlaceholder().should(
'have.text',
'Scenario run was successful but the display of results is disabled'
);
});
});
59 changes: 59 additions & 0 deletions cypress/e2e/brewery/Router-RedirectionFromDisabledView.cy.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
// Copyright (c) Cosmo Tech.
// Licensed under the MIT license.
import { DatasetManager, InstanceVisualization, Login } from '../../commons/actions';
import { getDashboardsTab } from '../../commons/actions/generic/Dashboards';
import { stub } from '../../commons/services/stubbing';
import { routeUtils as route } from '../../commons/utils';
import {
WORKSPACE_LIST_WITHOUT_DASHBOARDS,
WORKSPACE_WITHOUT_DASHBOARDS,
} from '../../fixtures/stubbing/ScenarioViewDashboard/workspace';
import { DEFAULT_SCENARIOS_LIST } from '../../fixtures/stubbing/default';

const scenarioId = DEFAULT_SCENARIOS_LIST[0].id;

describe('redirection from disabled view', () => {
before(() => {
stub.start();
stub.setWorkspaces(WORKSPACE_LIST_WITHOUT_DASHBOARDS);
});

beforeEach(() => {
Login.login({
url: `/${WORKSPACE_WITHOUT_DASHBOARDS.id}`,
workspaceId: WORKSPACE_WITHOUT_DASHBOARDS.id,
isPowerBiEnabled: false,
});
});

after(() => {
stub.stop();
});
it('can redirect from disabled Instance view to scenario view', () => {
route.browse({
url: `/${WORKSPACE_WITHOUT_DASHBOARDS.id}/instance`,
workspaceId: WORKSPACE_WITHOUT_DASHBOARDS.id,
isPowerBiEnabled: false,
expectedURL: `${WORKSPACE_WITHOUT_DASHBOARDS.id}/scenario/${scenarioId}`,
});
InstanceVisualization.getInstanceVisualizationViewTab().should('not.exist');
});
it('can redirect from disabled Dataset manager view to scenario view', () => {
route.browse({
url: `/${WORKSPACE_WITHOUT_DASHBOARDS.id}/datasetmanager`,
workspaceId: WORKSPACE_WITHOUT_DASHBOARDS.id,
isPowerBiEnabled: false,
expectedURL: `${WORKSPACE_WITHOUT_DASHBOARDS.id}/scenario/${scenarioId}`,
});
DatasetManager.getDatasetManagerTab().should('not.exist');
});
it('can redirect from dashboards to Scenario view when results display is disabled', () => {
route.browse({
url: `${WORKSPACE_WITHOUT_DASHBOARDS.id}/dashboards`,
workspaceId: WORKSPACE_WITHOUT_DASHBOARDS.id,
expectedURL: `${WORKSPACE_WITHOUT_DASHBOARDS.id}/scenario/${scenarioId}`,
isPowerBiEnabled: false,
});
getDashboardsTab().should('not.exist');
});
});
4 changes: 4 additions & 0 deletions cypress/e2e/brewery/ScenarioViewDashboard.cy.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
// Licensed under the MIT license.
import { Login, Scenarios, ScenarioParameters } from '../../commons/actions';
import { BreweryParameters } from '../../commons/actions/brewery';
import { getDashboardsTab } from '../../commons/actions/generic/Dashboards';
import { stub } from '../../commons/services/stubbing';
import { DEFAULT_SCENARIOS_LIST } from '../../fixtures/stubbing/default';

Expand All @@ -28,6 +29,9 @@ describe('Scenario view PowerBI report', () => {
};

it('can correctly show "out of sync" dashboard warning & "logs download" button', () => {
// check Dashboard view tab to ensure dashboard config exists
getDashboardsTab().should('be.visible');

ScenarioParameters.expandParametersAccordion();

// First phase: warning is never visible until we first launch the scenario
Expand Down
16 changes: 16 additions & 0 deletions cypress/fixtures/stubbing/ScenarioViewDashboard/workspace.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
// Copyright (c) Cosmo Tech.
// Licensed under the MIT license.
import { WORKSPACE_EXAMPLE } from '../default';

export const WORKSPACE_WITHOUT_DASHBOARDS = {
...WORKSPACE_EXAMPLE,
id: 'w-stbwrknodsh',
key: 'breweryNoDashboards',
webApp: {
url: null,
iframes: null,
options: null,
},
};

export const WORKSPACE_LIST_WITHOUT_DASHBOARDS = [WORKSPACE_EXAMPLE, WORKSPACE_WITHOUT_DASHBOARDS];
1 change: 1 addition & 0 deletions public/locales/en/translation.json
Original file line number Diff line number Diff line change
Expand Up @@ -298,6 +298,7 @@
"unknownStatus": {
"label": "This scenario has an unknown state, if the problem persists, please, contact your administrator"
},
"resultsDisplayDisabled": "Scenario run was successful but the display of results is disabled",
"error": {
"unknown": {
"details": "Something went wrong when fetching PowerBI reports info",
Expand Down
1 change: 1 addition & 0 deletions public/locales/fr/translation.json
Original file line number Diff line number Diff line change
Expand Up @@ -298,6 +298,7 @@
"unknownStatus": {
"label": "Le scénario a un statut inconnu, si le problème persiste, merci de contacter votre administrateur"
},
"resultsDisplayDisabled": "La simulation s'est terminée avec succès mais l'affichage des résultats est désactivé",
"error": {
"unknown": {
"details": "Une erreur est survenue lors de la récupération des informations des rapports PowerBI",
Expand Down
4 changes: 3 additions & 1 deletion src/AppLayout.js
Original file line number Diff line number Diff line change
Expand Up @@ -44,11 +44,13 @@ export const getTabsForCurrentWorkspace = (currentWorkspaceData) => {
export const filterTabsForCurrentWorkspace = (tabs, currentWorkspaceData) => {
const hideInstanceView = !ConfigUtils.isInstanceViewConfigValid(currentWorkspaceData?.webApp?.options?.instanceView);
const hideDatasetManager = !ConfigUtils.isDatasetManagerEnabledInWorkspace(currentWorkspaceData);
const hideDashboardsView = !ConfigUtils.isResultsDisplayEnabledInWorkspace(currentWorkspaceData);

return tabs.filter((tab) => {
if (
(hideInstanceView && tab.key === 'tabs.instance.key') ||
(hideDatasetManager && tab.key === 'tabs.datasetmanager.key')
(hideDatasetManager && tab.key === 'tabs.datasetmanager.key') ||
(hideDashboardsView && tab.key === 'tabs.dashboards.key')
)
return false;
return true;
Expand Down
4 changes: 4 additions & 0 deletions src/components/CurrentScenarioPowerBIReport/labels.js
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,10 @@ export const getReportLabels = (t) => ({
'This scenario has an unknown state, if the problem persists, please, contact your administrator'
),
},
resultsDisplayDisabled: t(
'commoncomponents.iframe.scenario.resultsDisplayDisabled',
'Scenario run was successful but the display of results is disabled'
),
downloadButton: t('commoncomponents.iframe.scenario.results.button.downloadLogs', 'Download logs'),
refreshTooltip: t('commoncomponents.iframe.scenario.results.button.refresh', 'Refresh'),
errors: {
Expand Down
53 changes: 27 additions & 26 deletions src/hooks/RouterHooks.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,44 +8,45 @@ import { useWorkspaceData } from '../state/hooks/WorkspaceHooks';
import { ConfigUtils } from '../utils';
import { useSortedScenarioList } from './ScenarioListHooks';

export const useRedirectFromInstanceToScenarioView = () => {
export const useRedirectFromDisabledView = (view) => {
const isUnmounted = useRef(false);
const currentWorkspaceData = useWorkspaceData();
const navigate = useNavigate();
const routerParameters = useParams();

useEffect(() => {
if (isUnmounted.current) {
return;
}
const isInstanceViewEnabled = ConfigUtils.isInstanceViewConfigValid(
currentWorkspaceData?.webApp?.options?.instanceView
);
if (isInstanceViewEnabled) return;
navigate('/workspaces');
return () => {
isUnmounted.current = true;
};
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [currentWorkspaceData?.webApp?.options?.instanceView]);
};

export const useRedirectFromDatasetManagerToScenarioView = () => {
const isUnmounted = useRef(false);
const currentWorkspaceData = useWorkspaceData();
const navigate = useNavigate();

useEffect(() => {
if (isUnmounted.current) {
return;
let isViewEnabled;
switch (view) {
case 'instance':
isViewEnabled = ConfigUtils.isInstanceViewConfigValid(currentWorkspaceData?.webApp?.options?.instanceView);
break;
case 'datasetManager':
isViewEnabled = ConfigUtils.isDatasetManagerEnabledInWorkspace(currentWorkspaceData);
break;
case 'dashboards':
isViewEnabled = ConfigUtils.isResultsDisplayEnabledInWorkspace(currentWorkspaceData);
break;
default:
isViewEnabled = true;
}
const isDatasetManagerViewEnabled = ConfigUtils.isDatasetManagerEnabledInWorkspace(currentWorkspaceData);
if (isDatasetManagerViewEnabled) return;
navigate('/workspaces');
if (isViewEnabled) return;
const workspaceId = routerParameters.workspaceId;
navigate(workspaceId ? `/${workspaceId}` : '/workspaces');
return () => {
isUnmounted.current = true;
};
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [currentWorkspaceData?.webApp?.options?.datasetmanager, navigate]);
}, [
currentWorkspaceData?.webApp?.options?.charts,
currentWorkspaceData?.webApp?.options?.instanceView,
currentWorkspaceData?.webApp?.options?.datasetmanager,
navigate,
view,
routerParameters.workspaceId,
currentWorkspaceData,
]);
};

export const useRouterScenarioId = () => {
Expand Down
6 changes: 5 additions & 1 deletion src/layouts/TabLayout/TabLayout.js
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,11 @@ export const TabLayout = (props) => {
const shouldRedirectFromDatasetManager =
currentTabPathname.startsWith(`/${routerParameters.workspaceId}/datasetmanager`) &&
!ConfigUtils.isDatasetManagerEnabledInWorkspace(currentWorkspace?.data);
const shouldRedirect = shouldRedirectFromInstanceView || shouldRedirectFromDatasetManager;
const shouldRedirectFromDashboardsView =
currentTabPathname.startsWith(`/${routerParameters.workspaceId}/dashboards`) &&
!ConfigUtils.isResultsDisplayEnabledInWorkspace(currentWorkspace?.data);
const shouldRedirect =
shouldRedirectFromInstanceView || shouldRedirectFromDatasetManager || shouldRedirectFromDashboardsView;
const tabValue = shouldRedirect ? `/${routerParameters.workspaceId}/scenario` : currentTabPathname;

const viewTabs = (
Expand Down
1 change: 1 addition & 0 deletions src/state/commons/Constants.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,5 @@ export const STATUSES = {
ERROR: 'ERROR',
SUCCESS: 'SUCCESS',
CREATED: 'CREATED',
DISABLED: 'DISABLED',
};
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
import { delay, put, select, takeLatest } from 'redux-saga/effects';
import { POWER_BI_INFO_POLLING_DELAY } from '../../../../services/config/FunctionalConstants';
import { PowerBIService } from '../../../../services/powerbi/PowerBIService';
import { forgePowerBIError } from '../../../../services/powerbi/errors';
import { PowerBIUtils } from '../../../../utils';
import { STATUSES } from '../../../commons/Constants';
import { POWER_BI_ACTIONS_KEY } from '../../../commons/PowerBIConstants';
Expand All @@ -27,16 +26,15 @@ export function* getPowerBIEmbedInfoSaga() {
const powerBIChartsConfig = yield select(getPowerBIChartsConfig);

if (powerBIChartsConfig == null) {
console.error(
'PowerBI charts configuration could not be found. Please configure the dashboards to be displayed in your ' +
'workspace, in [workspace].webApp.options.charts'
console.warn(
'PowerBI charts configuration could not be found and results display has been disabled. ' +
'If you want to activate it, please configure the dashboards to be displayed in your workspace, ' +
'in [workspace].webApp.options.charts'
);

yield put({
type: POWER_BI_ACTIONS_KEY.SET_EMBED_INFO,
data: noAccess,
error: forgePowerBIError('', 'Configuration error', 'Cannot find dashboards configuration in workspace data'),
status: STATUSES.ERROR,
status: STATUSES.DISABLED,
});
return;
}
Expand Down
6 changes: 6 additions & 0 deletions src/utils/ConfigUtils.js
Original file line number Diff line number Diff line change
Expand Up @@ -166,6 +166,11 @@ const isDatasetManagerEnabledInWorkspace = (workspace) => {
return true;
};

const isResultsDisplayEnabledInWorkspace = (workspace) => {
const reportsConfig = workspace?.webApp?.options?.charts;
return reportsConfig != null;
};

const checkUnknownKeysInConfig = (schema, data) => {
try {
schema.parse(data);
Expand Down Expand Up @@ -243,5 +248,6 @@ export const ConfigUtils = {
patchSolution,
isInstanceViewConfigValid,
isDatasetManagerEnabledInWorkspace,
isResultsDisplayEnabledInWorkspace,
checkUnknownKeysInConfig,
};
2 changes: 2 additions & 0 deletions src/views/Dashboards/Dashboards.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import { useTranslation } from 'react-i18next';
import PropTypes from 'prop-types';
import { Card, CardContent, Grid, Tab, Tabs } from '@mui/material';
import makeStyles from '@mui/styles/makeStyles';
import { useRedirectFromDisabledView } from '../../hooks/RouterHooks';
import { useDashboardsViewReportsConfig } from '../../state/hooks/PowerBIHooks';
import { DashboardsPowerBiReport } from './components';

Expand Down Expand Up @@ -70,6 +71,7 @@ const Dashboards = () => {
};

const dashboardsViewReportsConfig = useDashboardsViewReportsConfig();
useRedirectFromDisabledView('dashboards');
const dashboardTitle = dashboardsViewReportsConfig?.[value]?.title?.[i18n.language] ?? DEFAULT_MISSING_TITLE;

return (
Expand Down
Loading
Loading