Skip to content

Commit

Permalink
feat: [PROD-12917] replace deprecated workspace config key datasetFil…
Browse files Browse the repository at this point in the history
…ter by linkedDatasetIdList
  • Loading branch information
csm-thu committed Feb 7, 2024
1 parent 62c6a14 commit fbc2bb6
Show file tree
Hide file tree
Showing 6 changed files with 74 additions and 52 deletions.
25 changes: 9 additions & 16 deletions src/components/CreateScenarioButton/CreateScenarioButton.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@ import { render, screen } from '@testing-library/react';
import { Provider } from 'react-redux';

import CreateScenarioButton from '.';
import { logsLabels } from './labels';

const clone = rfdc();
const DEFAULT_SCENARIOS_LIST_DATA_WITH_DEPTHS = DEFAULT_SCENARIOS_LIST_DATA.map((scenario) => ({
Expand Down Expand Up @@ -123,7 +122,7 @@ describe('CreateScenarioButton', () => {

describe('Filter dataset List', () => {
const applyDatasetFilterToState = (state, datasetFilter) => {
state.workspace.current.data.webApp.options.datasetFilter = datasetFilter;
state.workspace.current.data.linkedDatasetIdList = datasetFilter;
};

const setUpWithDatasetFilter = (datasetFilter) => {
Expand All @@ -137,29 +136,23 @@ describe('CreateScenarioButton', () => {
expect(mockCreateScenarioUIProps.datasets).toEqual(DEFAULT_REDUX_STATE.dataset.list.data);
});

test('when filter is not a array, datasets are not filtered', () => {
setUpWithDatasetFilter('notAArrayFilter');
expect(spyConsoleWarn).toHaveBeenCalledWith(logsLabels.warning.datasetFilter.emptyOrNotArray);
test('when filter is not an array, datasets are not filtered', () => {
setUpWithDatasetFilter('notAnArrayFilter');
expect(spyConsoleWarn).toHaveBeenCalledTimes(1);
expect(mockCreateScenarioUIProps.datasets).toEqual(DEFAULT_REDUX_STATE.dataset.list.data);
});

test('when filter is empty, datasets are not filtered', () => {
test('must return an empty list of datasets if the filter is an empty list', () => {
setUpWithDatasetFilter([]);
expect(spyConsoleWarn).toHaveBeenCalledWith(logsLabels.warning.datasetFilter.emptyOrNotArray);
expect(mockCreateScenarioUIProps.datasets).toEqual(DEFAULT_REDUX_STATE.dataset.list.data);
expect(spyConsoleWarn).toHaveBeenCalledTimes(0);
expect(mockCreateScenarioUIProps.datasets).toEqual([]);
});

test('when dataset filter contains no dataset id on list it should be ignored', () => {
const datasetFilter = ['fakeDatasetId1', 'fakeDatasetId2'];
setUpWithDatasetFilter(datasetFilter);

expect(spyConsoleWarn).toHaveBeenCalledWith(logsLabels.warning.datasetFilter.noDatasetFound);
datasetFilter.forEach((dsetFilter) => {
expect(spyConsoleWarn).toHaveBeenCalledWith(
logsLabels.warning.datasetFilter.getDatasetNotFoundForFilter(dsetFilter)
);
});

expect(spyConsoleWarn).toHaveBeenCalledTimes(1 + datasetFilter.length);
expect(mockCreateScenarioUIProps.datasets).toEqual(DEFAULT_REDUX_STATE.dataset.list.data);
});

Expand All @@ -177,7 +170,7 @@ describe('CreateScenarioButton', () => {
test('when a filter is not string it should be ignored', () => {
const datasetFilter = [DEFAULT_REDUX_STATE.dataset.list.data[1].id, { id: 'fakeDatasetId' }];
setUpWithDatasetFilter(datasetFilter);
expect(spyConsoleWarn).toHaveBeenCalledWith(logsLabels.warning.datasetFilter.getNotAString(datasetFilter[1]));
expect(spyConsoleWarn).toHaveBeenCalledTimes(1);
expect(mockCreateScenarioUIProps.datasets).toHaveLength(1);
});
});
Expand Down
45 changes: 20 additions & 25 deletions src/components/CreateScenarioButton/CreateScenarioButtonHook.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,12 @@ import { useUser } from '../../state/hooks/AuthHooks';
import { useDatasets } from '../../state/hooks/DatasetHooks';
import { useCreateScenario, useCurrentScenario, useScenarios } from '../../state/hooks/ScenarioHooks';
import { useSolution } from '../../state/hooks/SolutionHooks';
import { useUserPermissionsOnCurrentWorkspace, useWorkspaceData } from '../../state/hooks/WorkspaceHooks';
import { getCreateScenarioDialogLabels, logsLabels } from './labels';
import {
useUserPermissionsOnCurrentWorkspace,
useWorkspaceData,
useWorkspaceDatasetsFilter,
} from '../../state/hooks/WorkspaceHooks';
import { getCreateScenarioDialogLabels } from './labels';
import { TranslationUtils } from '../../utils';

export const useCreateScenarioButton = ({ disabled, onScenarioCreated }) => {
Expand All @@ -20,6 +24,7 @@ export const useCreateScenarioButton = ({ disabled, onScenarioCreated }) => {
const solution = useSolution();

const workspaceData = useWorkspaceData();
const datasetsFilter = useWorkspaceDatasetsFilter();
const workspaceId = workspaceData.id;

const createScenarioOnBackend = useCreateScenario();
Expand Down Expand Up @@ -54,37 +59,27 @@ export const useCreateScenarioButton = ({ disabled, onScenarioCreated }) => {
}, [solution?.data?.runTemplates, workspaceData?.solution?.runTemplateFilter, t, clone]);

const filteredDatasets = useMemo(() => {
const datasetFilter = workspaceData?.webApp?.options?.datasetFilter;
if (!datasetFilter) {
return datasets;
}

if (!Array.isArray(datasetFilter) || !datasetFilter.length) {
console.warn(logsLabels.warning.datasetFilter.emptyOrNotArray);
return datasets;
}
const getMainDatasets = () => datasets.filter((dataset) => dataset.main === true);
if (!datasetsFilter) return getMainDatasets();

const result = [];
datasetFilter.forEach((dsetFilter) => {
if (typeof dsetFilter !== 'string') {
console.warn(logsLabels.warning.datasetFilter.getNotAString(dsetFilter));
} else {
const filteredDataset = datasets.find((dset) => dset.id === dsetFilter);
if (!filteredDataset) {
console.warn(logsLabels.warning.datasetFilter.getDatasetNotFoundForFilter(dsetFilter));
} else {
result.push(filteredDataset);
}
datasetsFilter.forEach((filterItem) => {
if (typeof filterItem !== 'string')
console.warn(`Ignoring dataset filter entry ${filterItem} because it is not a string`);
else {
const filteredDataset = datasets.find((dset) => dset.id === filterItem);
if (!filteredDataset) console.warn(`No dataset found for filter entry ${filterItem}`);
else result.push(filteredDataset);
}
});

if (!result.length) {
console.warn(logsLabels.warning.datasetFilter.noDatasetFound);
return datasets;
if (datasetsFilter.length > 0 && result.length === 0) {
console.warn('Ignoring datasets filter because no matching datasets have been found');
return getMainDatasets();
}

return result;
}, [datasets, workspaceData?.webApp?.options?.datasetFilter]);
}, [datasets, datasetsFilter]);

const createScenarioDialogLabels = getCreateScenarioDialogLabels(t, disabled);

Expand Down
11 changes: 0 additions & 11 deletions src/components/CreateScenarioButton/labels.js
Original file line number Diff line number Diff line change
@@ -1,17 +1,6 @@
// Copyright (c) Cosmo Tech.
// Licensed under the MIT license.

export const logsLabels = {
warning: {
datasetFilter: {
emptyOrNotArray: 'Datasets filter is ignored because is not a array or is empty',
getNotAString: (dsetFilter) => `Dataset filter entry ${dsetFilter} is ignored because is not a string`,
getDatasetNotFoundForFilter: (dsetFilter) => `No dataset found for dataset filter entry ${dsetFilter}`,
noDatasetFound: 'Datasets filter is ignored because no dataset match with filters',
},
},
};

export const getCreateScenarioDialogLabels = (t, disabled) => {
const createScenarioButtonTooltip = disabled
? t(
Expand Down
1 change: 1 addition & 0 deletions src/services/config/WorkspaceSchema.js
Original file line number Diff line number Diff line change
Expand Up @@ -158,6 +158,7 @@ export const WorkspaceSchema = z
.strict()
.optional()
.nullable(),
linkedDatasetIdList: z.array(z.string().optional().nullable()).optional().nullable(),
webApp: z
.object({
url: z.string().optional().nullable(),
Expand Down
32 changes: 32 additions & 0 deletions src/state/hooks/WorkspaceHooks.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,38 @@ export const useWorkspaceData = () => {
return useSelector((state) => state.workspace.current?.data);
};

export const useWorkspaceDatasetsFilter = () => {
const workspaceData = useWorkspaceData();

return useMemo(() => {
let filter = workspaceData?.linkedDatasetIdList ?? [];
if (!Array.isArray(filter)) {
console.warn('Ignoring datasets filter "linkedDatasetIdList" because it is not an array');
return [];
}

const deprecatedFilter = workspaceData?.webApp?.options?.datasetFilter;
if (deprecatedFilter != null) {
console.warn(
`Deprecated option used in configuration of workspace ${workspaceData?.id}` +
(workspaceData?.name ? ` (${workspaceData?.name})` : '') +
'.\nWorkspace key "webApp.options.datasetFilter" is deprecated. Please use the Cosmo Tech API to link ' +
'these datasets to your workspace instead.'
);
if (!Array.isArray(deprecatedFilter))
console.warn('Ignoring deprecated option "datasetFilter" because it is not an array');
else filter = filter.concat(deprecatedFilter);
}

return filter;
}, [
workspaceData?.id,
workspaceData?.name,
workspaceData?.linkedDatasetIdList,
workspaceData?.webApp?.options?.datasetFilter,
]);
};

export const useWorkspaceId = () => {
return useSelector((state) => state.workspace.current?.data?.id);
};
Expand Down
12 changes: 12 additions & 0 deletions tests/samples/datasets.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,20 +8,32 @@ export const DEFAULT_DATASETS_LIST_DATA = [
...DEFAULT_DATASET,
id: 'D-dataSetSmp1',
name: 'DataSet Sample 001',
main: true,
ingestionStatus: 'SUCCESS',
twincacheStatus: 'FULL',
},
{
...DEFAULT_DATASET,
id: 'D-dataSetSmp2',
name: 'DataSet Sample 002',
main: true,
ingestionStatus: 'SUCCESS',
twincacheStatus: 'FULL',
},
{
...DEFAULT_DATASET,
id: 'D-dataSetSmp3',
name: 'DataSet Sample 003',
main: true,
ingestionStatus: 'SUCCESS',
twincacheStatus: 'FULL',
},
{
...DEFAULT_DATASET,
id: 'D-dataSetSmp4',
name: 'DataSet Sample 004',
main: true,
ingestionStatus: 'SUCCESS',
twincacheStatus: 'FULL',
},
];

0 comments on commit fbc2bb6

Please sign in to comment.