Skip to content

Commit 4ad8f4a

Browse files
authored
fix: remember diffMode and collapsible sections state in localStorage (#760)
* fix: remember diff mode on suites and visual checks pages * fix: remember collapsible sections state on suites page in local storage
1 parent 669904a commit 4ad8f4a

15 files changed

Lines changed: 212 additions & 18 deletions

File tree

lib/constants/local-storage.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@ export const TIME_TRAVEL_PLAYER_VISIBILITY_KEY = 'time-travel-player-visibility'
77
export const TWO_UP_DIFF_VISIBILITY_KEY = '2up-diff-visibility';
88
export const TWO_UP_FIT_MODE_KEY = '2up-fit-mode';
99
export const HIDE_TREE_VIEW_SCREENSHOTS = 'hide-tree-view-screenshots';
10+
export const SUITES_PAGE_DIFF_MODE_KEY = 'app.suitesPage.diffMode';
11+
export const VISUAL_CHECKS_PAGE_DIFF_MODE_KEY = 'app.visualChecksPage.diffMode';
12+
export const SUITES_PAGE_EXPANDED_SECTIONS_KEY = 'app.suitesPage.expandedSectionsById';
1013

1114
export enum UiMode {
1215
Old = 'old',

lib/static/modules/local-storage-wrapper.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,5 @@ export function getItem(key, defaultValue) {
5050
* @returns {boolean}
5151
*/
5252
export function hasItem(key) {
53-
// eslint-disable-next-line no-prototype-builtins
54-
return window.localStorage.hasOwnProperty(_getStorageKey(key));
53+
return window.localStorage.getItem(_getStorageKey(key)) !== null;
5554
}

lib/static/modules/middlewares/local-storage.js

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import * as localStorageWrapper from '../local-storage-wrapper';
22
import actionNames from '../action-names';
3+
import {SUITES_PAGE_DIFF_MODE_KEY, VISUAL_CHECKS_PAGE_DIFF_MODE_KEY} from '../../../constants/local-storage';
34

45
export default store => next => action => {
56
const result = next(action);
@@ -11,13 +12,17 @@ export default store => next => action => {
1112
// as the filter is applied from the previous opening of another report
1213
localStorageWrapper.setItem('view', {
1314
expand: view.expand,
14-
diffMode: view.diffMode,
1515
strictMatchFilter: view.strictMatchFilter
1616
});
1717

18+
if (action.type === actionNames.SET_DIFF_MODE) {
19+
localStorageWrapper.setItem(SUITES_PAGE_DIFF_MODE_KEY, action.payload.diffModeId);
20+
}
21+
if (action.type === actionNames.VISUAL_CHECKS_SET_DIFF_MODE) {
22+
localStorageWrapper.setItem(VISUAL_CHECKS_PAGE_DIFF_MODE_KEY, action.payload.diffModeId);
23+
}
1824
localStorageWrapper.setItem('app.suitesPage.viewMode', app.suitesPage.viewMode);
1925
localStorageWrapper.setItem('app.visualChecksPage.viewMode', app.visualChecksPage.viewMode);
20-
localStorageWrapper.setItem('app.visualChecksPage.diffMode', app.visualChecksPage.diffMode);
2126
}
2227

2328
return result;

lib/static/modules/reducers/filters.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import {State} from '@/static/new-ui/types/store';
2-
import {Page, PathNames} from '@/constants';
2+
import {Page, PathNames, VISUAL_CHECKS_PAGE_DIFF_MODE_KEY} from '@/constants';
33
import actionNames from '@/static/modules/action-names';
44
import {FiltersAction, InitGuiReportAction, InitStaticReportAction} from '@/static/modules/actions';
55
import {DiffModeId, DiffModes, ViewMode} from '@/constants';
@@ -28,7 +28,7 @@ export default (state: State, action: FiltersAction | InitGuiReportAction | Init
2828
case actionNames.INIT_STATIC_REPORT: {
2929
const suitesPageViewMode = localStorageWrapper.getItem('app.suitesPage.viewMode', ViewMode.ALL) as ViewMode;
3030
const visualChecksPageViewMode = localStorageWrapper.getItem('app.visualChecksPage.viewMode', ViewMode.ALL) as ViewMode;
31-
const visualChecksPageDiffMode = localStorageWrapper.getItem('app.visualChecksPage.diffMode', DiffModes.TWO_UP_INTERACTIVE.id) as DiffModeId;
31+
const visualChecksPageDiffMode = localStorageWrapper.getItem(VISUAL_CHECKS_PAGE_DIFF_MODE_KEY, DiffModes.TWO_UP_INTERACTIVE.id) as DiffModeId;
3232

3333
const viewQuery = getViewQuery(window.location.search);
3434

lib/static/modules/reducers/suites-page.ts

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,12 @@ import {getSuitesTreeViewData} from '@/static/new-ui/features/suites/components/
66
import {findTreeNodeByBrowserId, findTreeNodeById, getGroupId} from '@/static/new-ui/features/suites/utils';
77
import * as localStorageWrapper from '../local-storage-wrapper';
88
import {MIN_SECTION_SIZE_PERCENT} from '@/static/new-ui/features/suites/constants';
9-
import {TIME_TRAVEL_PLAYER_VISIBILITY_KEY, TWO_UP_DIFF_VISIBILITY_KEY, TWO_UP_FIT_MODE_KEY} from '@/constants/local-storage';
9+
import {
10+
SUITES_PAGE_EXPANDED_SECTIONS_KEY,
11+
TIME_TRAVEL_PLAYER_VISIBILITY_KEY,
12+
TWO_UP_DIFF_VISIBILITY_KEY,
13+
TWO_UP_FIT_MODE_KEY
14+
} from '@/constants/local-storage';
1015
import {Page, TwoUpFitMode} from '@/constants';
1116

1217
const SECTION_SIZES_LOCAL_STORAGE_KEY = 'suites-page-section-sizes';
@@ -62,6 +67,7 @@ export default (state: State, action: SomeAction): State => {
6267
const isSnapshotsPlayerVisible = Boolean(localStorageWrapper.getItem(TIME_TRAVEL_PLAYER_VISIBILITY_KEY, true));
6368
const is2UpDiffVisible = Boolean(localStorageWrapper.getItem(TWO_UP_DIFF_VISIBILITY_KEY, true));
6469
const twoUpFitMode = localStorageWrapper.getItem(TWO_UP_FIT_MODE_KEY, TwoUpFitMode.FitToView) as TwoUpFitMode;
70+
const expandedSectionsById = localStorageWrapper.getItem(SUITES_PAGE_EXPANDED_SECTIONS_KEY, {}) as Record<string, boolean>;
6571

6672
return applyStateUpdate(state, {
6773
app: {
@@ -73,6 +79,7 @@ export default (state: State, action: SomeAction): State => {
7379
ui: {
7480
suitesPage: {
7581
expandedTreeNodesById,
82+
expandedSectionsById,
7683
treeViewMode,
7784
sectionSizes: suitesSectionSizes,
7885
isSnapshotsPlayerVisible
@@ -131,12 +138,16 @@ export default (state: State, action: SomeAction): State => {
131138
}) as State;
132139
}
133140
case actionNames.SUITES_PAGE_SET_SECTION_EXPANDED: {
141+
const expandedSectionsById = {
142+
...state.ui.suitesPage.expandedSectionsById,
143+
[action.payload.sectionId]: action.payload.isExpanded
144+
};
145+
localStorageWrapper.setItem(SUITES_PAGE_EXPANDED_SECTIONS_KEY, expandedSectionsById);
146+
134147
return applyStateUpdate(state, {
135148
ui: {
136149
suitesPage: {
137-
expandedSectionsById: {
138-
[action.payload.sectionId]: action.payload.isExpanded
139-
}
150+
expandedSectionsById
140151
}
141152
}
142153
}) as State;

lib/static/modules/reducers/view.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import * as localStorageWrapper from '../local-storage-wrapper';
22
import actionNames from '../action-names';
33
import {EXPAND_ALL, COLLAPSE_ALL, EXPAND_ERRORS, EXPAND_RETRIES} from '../../../constants/expand-modes';
4+
import {SUITES_PAGE_DIFF_MODE_KEY} from '../../../constants/local-storage';
45
import {getViewQuery} from '@/static/modules/custom-queries';
56

67
export default (state, action) => {
@@ -10,8 +11,9 @@ export default (state, action) => {
1011
const {baseHost, defaultView: viewMode, diffMode} = state.config;
1112
const viewQuery = getViewQuery(window.location.search);
1213
const lsView = localStorageWrapper.getItem('view', {});
14+
const suitesPageDiffMode = localStorageWrapper.getItem(SUITES_PAGE_DIFF_MODE_KEY, diffMode);
1315

14-
return {...state, view: {...state.view, viewMode, diffMode, baseHost, ...lsView, ...viewQuery}};
16+
return {...state, view: {...state.view, viewMode, baseHost, ...lsView, ...viewQuery, diffMode: suitesPageDiffMode}};
1517
}
1618

1719
case actionNames.VIEW_UPDATE_BASE_HOST: {

lib/static/modules/reducers/visual-checks-page.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,10 @@ import actionNames from '@/static/modules/action-names';
33
import {applyStateUpdate} from '@/static/modules/utils/state';
44
import {VisualChecksPageAction} from '@/static/modules/actions';
55
import * as localStorageWrapper from '../local-storage-wrapper';
6-
import {TWO_UP_DIFF_VISIBILITY_KEY, TWO_UP_FIT_MODE_KEY} from '@/constants/local-storage';
6+
import {
7+
TWO_UP_DIFF_VISIBILITY_KEY,
8+
TWO_UP_FIT_MODE_KEY
9+
} from '@/constants/local-storage';
710

811
export default (state: State, action: VisualChecksPageAction): State => {
912
switch (action.type) {

lib/static/new-ui/features/suites/components/CollapsibleSection/index.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ export function CollapsibleSectionInternal(props: CollapsibleSectionInternalProp
3535
<Disclosure.Summary>
3636
{(): ReactElement => {
3737
return <Flex gap={2} alignItems={'center'} onClick={onUpdateHandler} className={styles.summary}>
38-
<h3 className="text-header-1">{props.title}</h3>
38+
<h3 className="text-header-1" data-section-state={props.expanded ? 'opened' : 'closed'}>{props.title}</h3>
3939
<ChevronUp className={classNames(styles.expandArrow, {[styles['expand-arrow--expanded']]: props.expanded})}/>
4040
</Flex>;
4141
}}

lib/static/new-ui/features/suites/components/ScreenshotsTreeViewItem/index.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,14 +142,15 @@ export function ScreenshotsTreeViewItem(props: ScreenshotsTreeViewItemProps): Re
142142
<AssertViewStatus image={props.image}/>
143143
)}
144144
{isDiffModeSwitcherVisible && (
145-
<div className={styles.diffModeContainer}>
145+
<div className={styles.diffModeContainer} data-qa="suites-diff-mode-container">
146146
<RadioButton onUpdate={onDiffModeChangeHandler} value={diffMode} className={styles.diffModeSwitcher}>
147147
{getAvailableDiffModes(Page.suitesPage).map(diffMode =>
148148
<RadioButton.Option value={diffMode.id} content={diffMode.title} title={diffMode.description} key={diffMode.id}/>
149149
)}
150150
</RadioButton>
151151
<Select
152152
className={styles.diffModeSelect}
153+
qa="suites-diff-mode-select"
153154
label={<Icon data={ArrowRightArrowLeft}/> as unknown as string} value={[diffMode]}
154155
onUpdate={([diffMode]): void => onDiffModeChangeHandler(diffMode as DiffModeId)}
155156
multiple={false}

lib/static/new-ui/features/visual-checks/components/VisualChecksPage/VisualChecksStickyHeader.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -228,7 +228,7 @@ export function VisualChecksStickyHeader({currentNamedImage, treeData, onImageCh
228228
<AssertViewStatus image={currentImage}/>
229229
<Divider orientation={'vertical'}/>
230230
<Flex gap={2}>
231-
<Select className={styles.diffModeSelect} label={<Icon data={ArrowRightArrowLeft}/> as unknown as string} value={[diffMode]} onUpdate={([diffMode]): void => onChangeHandler(diffMode as DiffModeId)} multiple={false}>
231+
<Select className={styles.diffModeSelect} qa="visual-checks-diff-mode-select" label={<Icon data={ArrowRightArrowLeft}/> as unknown as string} value={[diffMode]} onUpdate={([diffMode]): void => onChangeHandler(diffMode as DiffModeId)} multiple={false}>
232232
{getAvailableDiffModes(Page.visualChecksPage).map(diffMode =>
233233
<Select.Option value={diffMode.id} content={diffMode.title} title={diffMode.description} key={diffMode.id}/>
234234
)}

0 commit comments

Comments
 (0)