Skip to content

Commit 5685142

Browse files
feat: Add option to display header in ContentExplorerModalContainer (#3144)
* feat: Add option to display header in ContentExplorerModalContainer * feat(content-explorer): Add additional props to modal container Co-authored-by: tjuanitas <7311041+tjuanitas@users.noreply.github.com>
1 parent 1f0809b commit 5685142

File tree

5 files changed

+63
-18
lines changed

5 files changed

+63
-18
lines changed

src/features/content-explorer/content-explorer-modal-container/ContentExplorerModalContainer.js

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,11 @@ import NewFolderModal from '../new-folder-modal';
88

99
class ContentExplorerModalContainer extends Component {
1010
static propTypes = {
11+
/**
12+
* Extra columns displayed in the folders table after folder name column
13+
* Each column has to be a Column element
14+
*/
15+
additionalColumns: PropTypes.arrayOf(PropTypes.element),
1116
/** Breadcrumb component options */
1217
breadcrumbProps: BreadcrumbPropType,
1318
/** Adds class name. */
@@ -110,19 +115,20 @@ class ContentExplorerModalContainer extends Component {
110115
itemNameLinkRenderer: PropTypes.func,
111116
/** Used to render item buttons in the list. Overrides the default buttons. */
112117
itemButtonRenderer: PropTypes.func,
118+
/** Height of an item row */
119+
itemRowHeight: PropTypes.number,
120+
/** Used to render the row element for items on the list */
121+
itemRowRenderer: PropTypes.func,
122+
/** Height of the item list header, defaults to 0, which makes header not visible */
123+
listHeaderHeight: PropTypes.number,
124+
/** Used to render the header row on the item list */
125+
listHeaderRenderer: PropTypes.func,
113126
/** Whether the new folder button should be shown */
114127
showCreateNewFolderButton: PropTypes.bool,
115128
/** Props for the search input */
116129
searchInputProps: PropTypes.object,
117130
/** Custom text for the choose button */
118131
chooseButtonText: PropTypes.node,
119-
/** Table row height */
120-
rowHeight: PropTypes.number,
121-
/**
122-
* Extra columns displayed in the folders table after folder name column
123-
* Each column has to be a Column element
124-
*/
125-
additionalColumns: PropTypes.arrayOf(PropTypes.element),
126132
};
127133

128134
static defaultProps = {

src/features/content-explorer/content-explorer-modal/ContentExplorerModal.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,13 @@ type Props = {
1818
description?: string,
1919
isOpen?: boolean,
2020
isResponsive?: boolean,
21+
itemRowHeight?: number,
22+
itemRowRenderer?: Function,
23+
listHeaderHeight?: number,
24+
listHeaderRenderer?: Function,
2125
onRequestClose?: Function,
2226
onSelectItem?: (item: Object, index: number) => void,
2327
onSelectedClick?: () => void,
24-
rowHeight?: number,
2528
title?: string,
2629
};
2730

src/features/content-explorer/content-explorer/ContentExplorer.js

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,11 @@ class ContentExplorer extends Component {
1919
static propTypes = {
2020
/** Props for the action buttons container */
2121
actionButtonsProps: PropTypes.object,
22+
/**
23+
* Extra columns displayed in the folders table after folder name column
24+
* Each column has to be a Column element
25+
*/
26+
additionalColumns: PropTypes.arrayOf(PropTypes.element),
2227
/** Props for breadcrumbs */
2328
breadcrumbProps: PropTypes.object,
2429
/** Props for the cancel button */
@@ -117,21 +122,20 @@ class ContentExplorer extends Component {
117122
itemNameLinkRenderer: PropTypes.func,
118123
/** Used to render item buttons in the list. Overrides the default buttons. */
119124
itemButtonRenderer: PropTypes.func,
125+
/** Height of an item row */
126+
itemRowHeight: PropTypes.number,
120127
/** Used to render the row element for items on the list. Allows row customizations such as adding tooltips, etc. */
121128
itemRowRenderer: PropTypes.func,
129+
/** Height of the item list header, defaults to 0, which makes header not visible */
130+
listHeaderHeight: PropTypes.number,
131+
/** Used to render the header row on the item list */
132+
listHeaderRenderer: PropTypes.func,
122133
/** Width of the item list */
123134
listWidth: PropTypes.number.isRequired,
124135
/** Height of the item list */
125136
listHeight: PropTypes.number.isRequired,
126137
/** Props for the search input */
127138
searchInputProps: PropTypes.object,
128-
/** Height of the row */
129-
rowHeight: PropTypes.number,
130-
/**
131-
* Extra columns displayed in the folders table after folder name column
132-
* Each column has to be a Column element
133-
*/
134-
additionalColumns: PropTypes.arrayOf(PropTypes.element),
135139
};
136140

137141
static defaultProps = {
@@ -396,6 +400,7 @@ class ContentExplorer extends Component {
396400
render() {
397401
const {
398402
actionButtonsProps,
403+
additionalColumns,
399404
breadcrumbProps,
400405
cancelButtonProps,
401406
chooseButtonProps,
@@ -424,12 +429,13 @@ class ContentExplorer extends Component {
424429
itemIconRenderer,
425430
itemNameLinkRenderer,
426431
itemButtonRenderer,
432+
itemRowHeight,
427433
itemRowRenderer,
434+
listHeaderHeight,
435+
listHeaderRenderer,
428436
listWidth,
429437
listHeight,
430438
searchInputProps,
431-
rowHeight,
432-
additionalColumns,
433439
...rest
434440
} = this.props;
435441
const { isInSearchMode, foldersPath, selectedItems, isSelectAllChecked } = this.state;
@@ -507,6 +513,8 @@ class ContentExplorer extends Component {
507513
<ItemList
508514
additionalColumns={additionalColumns}
509515
contentExplorerMode={contentExplorerMode}
516+
headerHeight={listHeaderHeight}
517+
headerRenderer={listHeaderRenderer}
510518
height={listHeight}
511519
isResponsive={isResponsive}
512520
itemButtonRenderer={itemButtonRenderer}
@@ -521,9 +529,9 @@ class ContentExplorer extends Component {
521529
onItemDoubleClick={this.handleItemDoubleClick}
522530
onItemNameClick={this.handleItemNameClick}
523531
onLoadMoreItems={onLoadMoreItems}
532+
rowHeight={itemRowHeight}
524533
selectedItems={selectedItems}
525534
width={listWidth}
526-
rowHeight={rowHeight}
527535
/>
528536
<ContentExplorerActionButtons
529537
actionButtonsProps={actionButtonsProps}

src/features/content-explorer/item-list/ItemList.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,8 @@ const ItemList = ({
137137
onItemDoubleClick,
138138
onItemNameClick,
139139
onLoadMoreItems,
140+
headerHeight,
141+
headerRenderer,
140142
itemIconRenderer,
141143
itemNameLinkRenderer,
142144
itemButtonRenderer,
@@ -219,6 +221,8 @@ const ItemList = ({
219221
headerClassName="table-header-item"
220222
width={width}
221223
height={height}
224+
headerHeight={headerHeight}
225+
headerRowRenderer={headerRenderer}
222226
rowHeight={rowHeight}
223227
rowCount={items.length}
224228
onRowClick={onItemClick}
@@ -282,6 +286,8 @@ ItemList.propTypes = {
282286
onItemDoubleClick: PropTypes.func,
283287
onItemNameClick: PropTypes.func,
284288
onLoadMoreItems: PropTypes.func,
289+
headerHeight: PropTypes.number,
290+
headerRenderer: PropTypes.func,
285291
itemIconRenderer: PropTypes.func,
286292
itemNameLinkRenderer: PropTypes.func,
287293
itemButtonRenderer: PropTypes.func,

src/features/content-explorer/item-list/__tests__/ItemList.test.js

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -291,4 +291,26 @@ describe('features/content-explorer/item-list/ItemList', () => {
291291
expect(wrapper.find('.item-list-accessLevel-col').length).toBe(3);
292292
});
293293
});
294+
295+
describe('headerHeight', () => {
296+
test('should display header row with specified height', () => {
297+
const headerHeight = 30;
298+
const wrapper = renderComponent({
299+
headerHeight,
300+
});
301+
302+
const header = wrapper.find('.ReactVirtualized__Table__headerRow');
303+
expect(header.props().style.height).toBe(headerHeight);
304+
});
305+
});
306+
307+
describe('headerRenderer', () => {
308+
test('should use headerRenderer when specified', () => {
309+
const wrapper = renderComponent({
310+
headerRenderer: () => <div data-testid="customHeader">Custom Header</div>,
311+
});
312+
const headerRow = wrapper.find("[data-testid='customHeader']");
313+
expect(headerRow.length).toBe(1);
314+
});
315+
});
294316
});

0 commit comments

Comments
 (0)