fix: toggle behaviour for video & file view

- fix toggle behaviour for video and file view.
- Before:
  - The default view was card. And The videos and files both pages were sharing same variable & default view.
  - Whenever user selects list view on videos/files page and redirects to another page, the toggle/view shifts again to default(card) view whenever it returns to videos/files page.

- After:
  - The default view is list now. And The videos and files both pages can have different state & default view.
  - Whenever user selects card view on videos/files page and redirects to another page, the toggle/view remain same whatever user had selected before when it returns to videos/files page.

Note: Refreshing a page will use default(list) view.
This commit is contained in:
Muhammad Faraz Maqsood
2025-04-14 15:32:20 +05:00
committed by Muhammad Faraz Maqsood
parent 9adfa58d65
commit ea8a8e5285
4 changed files with 56 additions and 8 deletions

View File

@@ -40,6 +40,27 @@ export const initialState = {
},
},
},
videos: {
videoIds: ['mOckID1'],
pageSettings: {},
loadingStatus: RequestStatus.SUCCESSFUL,
updatingStatus: '',
addingStatus: '',
deletingStatus: '',
usageStatus: '',
transcriptStatus: '',
errors: {
add: [],
delete: [],
thumbnail: [],
download: [],
usageMetrics: [],
transcript: [],
loading: '',
},
filesCurrentView: 'card',
videosCurrentView: 'list',
},
};
export const generateFetchAssetApiResponse = () => ({

View File

@@ -1,4 +1,5 @@
import React, { useCallback, useEffect, useState } from 'react';
import { useCallback, useEffect, useState } from 'react';
import { useDispatch, useSelector } from 'react-redux';
import PropTypes from 'prop-types';
import isEmpty from 'lodash/isEmpty';
import { injectIntl, intlShape } from '@edx/frontend-platform/i18n';
@@ -26,6 +27,10 @@ import {
} from './table-components';
import ApiStatusToast from './ApiStatusToast';
import DeleteConfirmationModal from './DeleteConfirmationModal';
import {
setFilesCurrentViewState,
setVideosCurrentViewState,
} from '../videos-page/data/slice';
const FileTable = ({
files,
@@ -44,7 +49,7 @@ const FileTable = ({
// injected
intl,
}) => {
const defaultVal = 'card';
const dispatch = useDispatch();
const pageCount = Math.ceil(files.length / 50);
const columnSizes = {
xs: 12,
@@ -53,7 +58,10 @@ const FileTable = ({
lg: 3,
xl: 2,
};
const [currentView, setCurrentView] = useState(defaultVal);
const {
filesCurrentView,
videosCurrentView,
} = useSelector((state) => state.videos);
const [isDeleteOpen, setDeleteOpen, setDeleteClose] = useToggle(false);
const [isDownloadOpen, setDownloadOpen, setDownloadClose] = useToggle(false);
const [isAssetInfoOpen, openAssetInfo, closeAssetinfo] = useToggle(false);
@@ -198,8 +206,15 @@ const FileTable = ({
defaultColumnValues={{ Filter: TextFilter }}
dataViewToggleOptions={{
isDataViewToggleEnabled: true,
onDataViewToggle: val => setCurrentView(val),
defaultActiveStateValue: defaultVal,
onDataViewToggle: (val) => {
if (fileType === 'video') {
dispatch(setVideosCurrentViewState({ videosCurrentView: val }));
} else {
// There's only 2 fileTypes currently being used i.e. video or file
dispatch(setFilesCurrentViewState({ filesCurrentView: val }));
}
},
defaultActiveStateValue: (fileType === 'video' && videosCurrentView) || (fileType === 'file' && filesCurrentView),
togglePlacement: 'left',
}}
initialState={initialState}
@@ -227,8 +242,8 @@ const FileTable = ({
<div data-testid="files-data-table" className="bg-light-200">
<DataTable.TableControlBar />
<hr className="mb-5 border-light-700" />
{ currentView === 'card' && <CardView CardComponent={fileCard} columnSizes={columnSizes} selectionPlacement="left" skeletonCardCount={6} /> }
{ currentView === 'list' && <DataTable.Table /> }
{ ((fileType === 'video' && videosCurrentView === 'card') || (fileType === 'file' && filesCurrentView === 'card')) && <CardView CardComponent={fileCard} columnSizes={columnSizes} selectionPlacement="left" skeletonCardCount={6} /> }
{ ((fileType === 'video' && videosCurrentView === 'list') || (fileType === 'file' && filesCurrentView === 'list')) && <DataTable.Table /> }
<DataTable.EmptyTable content={intl.formatMessage(messages.noResultsFoundMessage)} />
<Footer />
</div>
@@ -243,7 +258,7 @@ const FileTable = ({
fileType={fileType}
/>
{fileType === 'files' && (
{fileType === 'file' && (
<ApiStatusToast
actionType={intl.formatMessage(messages.apiStatusAddingAction)}
selectedRowCount={selectedRows.length}

View File

@@ -23,11 +23,19 @@ const slice = createSlice({
transcript: [],
loading: '',
},
filesCurrentView: 'list',
videosCurrentView: 'list',
},
reducers: {
setVideoIds: (state, { payload }) => {
state.videoIds = payload.videoIds;
},
setVideosCurrentViewState: (state, { payload }) => {
state.videosCurrentView = payload.videosCurrentView;
},
setFilesCurrentViewState: (state, { payload }) => {
state.filesCurrentView = payload.filesCurrentView;
},
setPageSettings: (state, { payload }) => {
state.pageSettings = payload;
},
@@ -98,6 +106,8 @@ const slice = createSlice({
export const {
setVideoIds,
setVideosCurrentViewState,
setFilesCurrentViewState,
setPageSettings,
updateLoadingStatus,
deleteVideoSuccess,

View File

@@ -84,6 +84,8 @@ export const initialState = {
transcript: [],
loading: '',
},
filesCurrentView: 'list',
videosCurrentView: 'card',
},
models: {
videos: {