@@ -4,6 +4,7 @@ import React, { Component, type ComponentType } from 'react';
44import { Button , Dropdown } from 'semantic-ui-react' ;
55import _ from 'underscore' ;
66import { SORT_ASCENDING } from './DataList' ;
7+ import ListSessionUtils from '../utils/ListSession' ;
78
89type Sort = {
910 key : string ,
@@ -14,10 +15,15 @@ type Sort = {
1415
1516type Props = {
1617 basic ?: boolean ,
18+ columns ?: Array < any > ,
1719 defaultView ?: number ,
1820 hideToggle ?: boolean ,
1921 onSort ?: ( sortColumn : string , sortDirection ?: ?string ) => void ,
2022 renderListHeader ?: ( ) => JSX . Element ,
23+ session ?: {
24+ key : string ,
25+ storage : typeof sessionStorage
26+ } ,
2127 sort ?: Array < Sort > ,
2228 sortColor ?: string ,
2329 sortColumn ?: string ,
@@ -30,7 +36,8 @@ type State = {
3036
3137const Views = {
3238 list : 0 ,
33- grid : 1
39+ grid : 1 ,
40+ table : 2
3441} ;
3542
3643/**
@@ -60,8 +67,12 @@ const useItemsToggle = (WrappedComponent: ComponentType<any>) => (
6067 constructor ( props : any ) {
6168 super ( props ) ;
6269
70+ // set view based on session storage if present
71+ const { key , storage } = props . session || { } ;
72+ const session = ListSessionUtils . restoreSession ( key , storage ) || { } ;
73+
6374 this . state = {
64- view : props . defaultView || Views . list
75+ view : session . view || props . defaultView || Views . list
6576 } ;
6677 }
6778
@@ -105,6 +116,31 @@ const useItemsToggle = (WrappedComponent: ComponentType<any>) => (
105116 this . props . onSort ( sort . value , sortDirection ) ;
106117 }
107118
119+ /**
120+ * Updates the session whenever the view state changes.
121+ *
122+ * @param prevProps
123+ * @param prevState
124+ */
125+ componentDidUpdate ( prevProps : Props , prevState : State ) {
126+ if ( prevState . view !== this . state . view ) {
127+ this . setSession ( ) ;
128+ }
129+ }
130+
131+ /**
132+ * Sets the view property on the session.
133+ */
134+ setSession ( ) {
135+ const { key, storage } = this . props . session || { } ;
136+
137+ if ( ! key ) {
138+ return ;
139+ }
140+
141+ ListSessionUtils . setSession ( key , storage , { view : this . state . view } ) ;
142+ }
143+
108144 /**
109145 * Renders the ItemsToggle component.
110146 *
@@ -153,6 +189,15 @@ const useItemsToggle = (WrappedComponent: ComponentType<any>) => (
153189 icon = 'grid layout'
154190 onClick = { ( ) => this . setState ( { view : Views . grid } ) }
155191 />
192+ { ! _ . isEmpty ( this . props . columns ) && (
193+ < Button
194+ active = { this . state . view === Views . table }
195+ aria-label = 'Table View'
196+ basic = { this . props . basic }
197+ icon = 'table'
198+ onClick = { ( ) => this . setState ( { view : Views . table } ) }
199+ />
200+ ) }
156201 </ >
157202 ) }
158203 { ! _ . isEmpty ( this . props . sort ) && this . props . onSort && (
0 commit comments