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

Add disable preview toggle in settings panel #1977

Merged
merged 38 commits into from
Jul 25, 2024
Merged
Show file tree
Hide file tree
Changes from 13 commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
fe8c0de
add disable preview toggle
SajidAlamQB Jul 10, 2024
5a83933
Merge branch 'main' into feat/disable-preview
SajidAlamQB Jul 10, 2024
527529c
Merge branch 'main' into feat/disable-preview
SajidAlamQB Jul 10, 2024
7e69aca
rename and add api call
SajidAlamQB Jul 10, 2024
cddf0be
add to localstore
SajidAlamQB Jul 11, 2024
5c7664f
api backend implementation
SajidAlamQB Jul 15, 2024
9204db6
add new api endpoint
SajidAlamQB Jul 16, 2024
7731c0d
changes based on review
SajidAlamQB Jul 17, 2024
1f22e33
coverage
SajidAlamQB Jul 17, 2024
41137d9
add tests
SajidAlamQB Jul 17, 2024
c4cc6a1
lint
SajidAlamQB Jul 17, 2024
90ca5d0
design changes
SajidAlamQB Jul 18, 2024
58538bd
Merge branch 'main' into feat/disable-preview
SajidAlamQB Jul 18, 2024
b9d07f0
changes based on review 2
SajidAlamQB Jul 18, 2024
7468b5d
changes based on review 3
SajidAlamQB Jul 19, 2024
f40d627
add reducer test
SajidAlamQB Jul 19, 2024
1b90d05
elint fix
SajidAlamQB Jul 19, 2024
46eb7ef
changes based on review
SajidAlamQB Jul 22, 2024
c38c51b
Update test_router.py
SajidAlamQB Jul 22, 2024
99aade6
Update router.py
SajidAlamQB Jul 22, 2024
9ec067d
remove fstring
SajidAlamQB Jul 22, 2024
3657cfa
Add new endpoint to fetch initial showDatasetsPreviews value
SajidAlamQB Jul 22, 2024
013ca1c
coverage
SajidAlamQB Jul 22, 2024
82bc31c
Merge branch 'main' into feat/disable-preview
SajidAlamQB Jul 22, 2024
1d1796e
redux thunk for preferences API
SajidAlamQB Jul 23, 2024
0efaee1
Update preferences.js
SajidAlamQB Jul 23, 2024
03b4a50
Update settings-modal.js
SajidAlamQB Jul 23, 2024
055ed76
revert nested
SajidAlamQB Jul 23, 2024
a6603bf
changes based on review
SajidAlamQB Jul 23, 2024
f184349
combine preference action
SajidAlamQB Jul 24, 2024
7a070e0
changes based on reviews
SajidAlamQB Jul 24, 2024
4f048c2
Update settings-modal.test.js
SajidAlamQB Jul 24, 2024
19013bd
Merge branch 'main' into feat/disable-preview
SajidAlamQB Jul 24, 2024
a9a7419
Update RELEASE.md
SajidAlamQB Jul 24, 2024
07bb7b7
rename and add nesting
SajidAlamQB Jul 24, 2024
2c80e6a
update tests
SajidAlamQB Jul 24, 2024
f8aeeca
Merge branch 'main' into feat/disable-preview
SajidAlamQB Jul 24, 2024
b26b754
changes based on reviews
SajidAlamQB Jul 25, 2024
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
6 changes: 6 additions & 0 deletions package/kedro_viz/api/rest/requests.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,3 +10,9 @@ class DeployerConfiguration(BaseModel):
is_all_previews_enabled: bool = False
endpoint: str
bucket_name: str


class UserPreference(BaseModel):
"""User preferences for Kedro Viz."""

showDatasetPreviews: bool
17 changes: 15 additions & 2 deletions package/kedro_viz/api/rest/router.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,16 @@
import logging
from typing import List

from fastapi import APIRouter
from fastapi import APIRouter, HTTPException
from fastapi.responses import JSONResponse

from kedro_viz.api.rest.requests import DeployerConfiguration
from kedro_viz.api.rest.requests import DeployerConfiguration, UserPreference
from kedro_viz.constants import PACKAGE_REQUIREMENTS
from kedro_viz.integrations.deployment.deployer_factory import DeployerFactory

from .responses import (
APIErrorMessage,
DataNodeMetadata,
GraphAPIResponse,
NodeMetadataAPIResponse,
PackageCompatibilityAPIResponse,
Expand Down Expand Up @@ -49,6 +50,18 @@ async def get_single_node_metadata(node_id: str):
return get_node_metadata_response(node_id)


@router.post("/preferences")
async def update_preferences(preferences: UserPreference):
try:
DataNodeMetadata.set_is_all_previews_enabled(preferences.showDatasetPreviews)
return {"message": "Preferences updated successfully"}
except Exception as exception:
logger.error("Failed to update preferences: %s", str(exception))
raise HTTPException(
status_code=500, detail="Failed to update preferences"
) from exception


@router.get(
"/pipelines/{registered_pipeline_id}",
response_model=GraphAPIResponse,
Expand Down
21 changes: 21 additions & 0 deletions package/tests/test_api/test_rest/test_router.py
Original file line number Diff line number Diff line change
Expand Up @@ -86,3 +86,24 @@ def test_get_package_compatibilities(

assert response.status_code == expected_status_code
assert response.json() == expected_response


def test_update_preferences_success(client, mocker):
mocker.patch(
"kedro_viz.api.rest.responses.DataNodeMetadata.set_is_all_previews_enabled"
)
response = client.post("api/preferences", json={"showDatasetPreviews": True})

assert response.status_code == 200
assert response.json() == {"message": "Preferences updated successfully"}


def test_update_preferences_failure(client, mocker):
mocker.patch(
"kedro_viz.api.rest.responses.DataNodeMetadata.set_is_all_previews_enabled",
side_effect=Exception("Test Exception"),
)
response = client.post("api/preferences", json={"showDatasetPreviews": True})

assert response.status_code == 500
assert response.json() == {"detail": "Failed to update preferences"}
13 changes: 13 additions & 0 deletions src/actions/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -141,6 +141,19 @@ export function toggleShowFeatureHints(showFeatureHints) {
};
}

export const TOGGLE_SHOW_DATASET_PREVIEWS = 'TOGGLE_SHOW_DATASET_PREVIEWS';

/**
* Toggle whether to show dataset previews on/off
* @param {Boolean} showDatasetPreviews True if dataset previews are to be shown
*/
export function toggleShowDatasetPreviews(showDatasetPreviews) {
return {
type: TOGGLE_SHOW_DATASET_PREVIEWS,
showDatasetPreviews,
};
}

export const TOGGLE_SIDEBAR = 'TOGGLE_SIDEBAR';

/**
Expand Down
56 changes: 55 additions & 1 deletion src/components/settings-modal/settings-modal.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import {
toggleShowFeatureHints,
toggleIsPrettyName,
toggleSettingsModal,
toggleShowDatasetPreviews,
} from '../../actions';
import { getFlagsState } from '../../utils/flags';
import SettingsModalRow from './settings-modal-row';
Expand All @@ -27,10 +28,12 @@ const SettingsModal = ({
showFeatureHints,
isOutdated,
isPrettyName,
showDatasetPreviews,
latestVersion,
onToggleFlag,
onToggleShowFeatureHints,
onToggleIsPrettyName,
onToggleShowDatasetPreviews,
showSettingsModal,
visible,
}) => {
Expand All @@ -40,12 +43,18 @@ const SettingsModal = ({
const [isPrettyNameValue, setIsPrettyName] = useState(isPrettyName);
const [showFeatureHintsValue, setShowFeatureHintsValue] =
useState(showFeatureHints);
const [showDatasetPreviewsValue, setShowDatasetPreviewsValue] =
useState(showDatasetPreviews);
const [toggleFlags, setToggleFlags] = useState(flags);

useEffect(() => {
setShowFeatureHintsValue(showFeatureHints);
}, [showFeatureHints]);

useEffect(() => {
setShowDatasetPreviewsValue(showDatasetPreviews);
}, [showDatasetPreviews]);

useEffect(() => {
let modalTimeout, resetTimeout;

Expand All @@ -65,6 +74,7 @@ const SettingsModal = ({

onToggleIsPrettyName(isPrettyNameValue);
onToggleShowFeatureHints(showFeatureHintsValue);
onToggleShowDatasetPreviews(showDatasetPreviewsValue);
setHasNotInteracted(true);
setHasClickApplyAndClose(false);

Expand All @@ -80,19 +90,49 @@ const SettingsModal = ({
hasClickedApplyAndClose,
showFeatureHintsValue,
isPrettyNameValue,
showDatasetPreviewsValue,
onToggleFlag,
onToggleShowFeatureHints,
onToggleIsPrettyName,
onToggleShowDatasetPreviews,
showSettingsModal,
toggleFlags,
]);

useEffect(() => {
const updatePreferences = async () => {
try {
const response = await fetch('/api/preferences', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
showDatasetPreviews: showDatasetPreviewsValue,
}),
});

if (!response.ok) {
throw new Error('Failed to update preferences');
}

const result = await response.json();
console.log('Preferences updated successfully:', result);
} catch (error) {
console.error('Error updating preferences:', error);
}
};

updatePreferences();
}, [showDatasetPreviewsValue]);

const resetStateCloseModal = () => {
showSettingsModal(false);
setHasNotInteracted(true);
setToggleFlags(flags);
setIsPrettyName(isPrettyName);
setShowFeatureHintsValue(showFeatureHintsValue);
setShowFeatureHintsValue(showFeatureHints);
setShowDatasetPreviewsValue(showDatasetPreviews);
};

return (
Expand Down Expand Up @@ -130,6 +170,16 @@ const SettingsModal = ({
}
}}
/>
<SettingsModalRow
id="showDatasetPreviews"
name={settingsConfig['showDatasetPreviews'].name}
toggleValue={showDatasetPreviewsValue}
description={settingsConfig['showDatasetPreviews'].description}
onToggleChange={(event) => {
setShowDatasetPreviewsValue(event.target.checked);
setHasNotInteracted(false);
}}
/>
{flagData.map(({ name, value, description }) => (
<SettingsModalRow
description={description}
Expand Down Expand Up @@ -209,6 +259,7 @@ export const mapStateToProps = (state) => ({
flags: state.flags,
showFeatureHints: state.showFeatureHints,
isPrettyName: state.isPrettyName,
showDatasetPreviews: state.showDatasetPreviews,
visible: state.visible,
});

Expand All @@ -225,6 +276,9 @@ export const mapDispatchToProps = (dispatch) => ({
onToggleShowFeatureHints: (value) => {
dispatch(toggleShowFeatureHints(value));
},
onToggleShowDatasetPreviews: (value) => {
dispatch(toggleShowDatasetPreviews(value));
},
});

export default connect(mapStateToProps, mapDispatchToProps)(SettingsModal);
7 changes: 7 additions & 0 deletions src/components/settings-modal/settings-modal.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ describe('SettingsModal', () => {
exportModal: expect.any(Boolean),
settingsModal: expect.any(Boolean),
}),
showDatasetPreviews: expect.any(Boolean),
flags: expect.any(Object),
isPrettyName: expect.any(Boolean),
showFeatureHints: expect.any(Boolean),
Expand Down Expand Up @@ -74,5 +75,11 @@ describe('SettingsModal', () => {
type: 'TOGGLE_IS_PRETTY_NAME',
isPrettyName: false,
});

mapDispatchToProps(dispatch).onToggleShowDatasetPreviews(false);
expect(dispatch.mock.calls[3][0]).toEqual({
type: 'TOGGLE_SHOW_DATASET_PREVIEWS',
showDatasetPreviews: false,
});
});
});
5 changes: 5 additions & 0 deletions src/config.js
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,11 @@ export const settings = {
description: 'Enable or disable all new feature hints in the interface.',
default: true,
},
showDatasetPreviews: {
name: 'Dataset previews',
description: 'Display preview data for all datasets.',
default: true,
},
};

// Sidebar groups is an ordered map of { id: label }
Expand Down
6 changes: 6 additions & 0 deletions src/reducers/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import visible from './visible';
import {
RESET_DATA,
TOGGLE_SHOW_FEATURE_HINTS,
TOGGLE_SHOW_DATASET_PREVIEWS,
TOGGLE_HOVERED_FOCUS_MODE,
TOGGLE_IGNORE_LARGE_WARNING,
TOGGLE_IS_PRETTY_NAME,
Expand Down Expand Up @@ -81,6 +82,11 @@ const combinedReducer = combineReducers({
TOGGLE_SHOW_FEATURE_HINTS,
'showFeatureHints'
),
showDatasetPreviews: createReducer(
true,
TOGGLE_SHOW_DATASET_PREVIEWS,
'showDatasetPreviews'
),
hoveredParameters: createReducer(
false,
TOGGLE_PARAMETERS_HOVERED,
Expand Down
1 change: 1 addition & 0 deletions src/store/initial-state.js
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ export const createInitialState = () => ({
expandAllPipelines: false,
isPrettyName: settings.isPrettyName.default,
showFeatureHints: settings.showFeatureHints.default,
showDatasetPreviews: settings.showDatasetPreviews.default,
ignoreLargeWarning: false,
loading: {
graph: false,
Expand Down
1 change: 1 addition & 0 deletions src/store/store.js
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ const saveStateToLocalStorage = (state) => {
theme: state.theme,
isPrettyName: state.isPrettyName,
showFeatureHints: state.showFeatureHints,
showDatasetPreviews: state.showDatasetPreviews,
flags: state.flags,
expandAllPipelines: state.expandAllPipelines,
});
Expand Down
Loading