Skip to content

Commit 46fc21f

Browse files
authored
feat(content-explorer-modal-container): add noItemsRenderer prop (#3945)
1 parent 172ca46 commit 46fc21f

File tree

6 files changed

+39
-9
lines changed

6 files changed

+39
-9
lines changed

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,8 @@ class ContentExplorerModalContainer extends Component {
153153
chooseButtonText: PropTypes.node,
154154
/** Text for the informational notice, defaults to empty string, which makes notice not visible */
155155
infoNoticeText: PropTypes.string,
156+
/** Used to render the no items state. Overrides the default no items state. */
157+
noItemsRenderer: PropTypes.func,
156158
};
157159

158160
static defaultProps = {

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,22 +66,25 @@ describe('features/content-explorer/content-explorer-modal-container/ContentExpl
6666
expect(wrapper.find('NewFolderModal').prop('parentFolderName')).toEqual(parentFolderName);
6767
});
6868

69-
test('should pass searchInputProps, chooseButtonText, onSelectItem, and onSelectedClick to ContentExplorerModal', () => {
69+
test('should pass searchInputProps, chooseButtonText, onSelectItem, onSelectedClick and noItemsRenderer to ContentExplorerModal', () => {
7070
const searchInputProps = { placeholder: 'test' };
7171
const chooseButtonText = 'test';
7272
const onSelectedClick = () => {};
7373
const onSelectItem = () => {};
74+
const noItemsRenderer = () => <div>No items</div>;
7475
const wrapper = renderComponent({
7576
searchInputProps,
7677
chooseButtonText,
7778
onSelectedClick,
7879
onSelectItem,
80+
noItemsRenderer,
7981
});
8082

8183
expect(wrapper.find('ContentExplorerModal').prop('searchInputProps')).toEqual(searchInputProps);
8284
expect(wrapper.find('ContentExplorerModal').prop('chooseButtonText')).toEqual(chooseButtonText);
8385
expect(wrapper.find('ContentExplorerModal').prop('onSelectedClick')).toEqual(onSelectedClick);
8486
expect(wrapper.find('ContentExplorerModal').prop('onSelectItem')).toEqual(onSelectItem);
87+
expect(wrapper.find('ContentExplorerModal').prop('noItemsRenderer')).toEqual(noItemsRenderer);
8588
});
8689

8790
test('should render ContentExplorerModal and NewFolderModal in Portal by default', () => {

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ type Props = {
3636
shouldNotUsePortal?: boolean,
3737
title?: string,
3838
infoNoticeText?: string,
39+
noItemsRenderer?: Function,
3940
};
4041

4142
const ContentExplorerModal = ({

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

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -63,18 +63,18 @@ describe('features/content-explorer/content-explorer-modal/ContentExplorerModal'
6363
expect(wrapper).toMatchSnapshot();
6464
});
6565

66-
test('should pass onSelectedClick and onSelectItem to ContentExplorer', () => {
66+
test('should pass onSelectedClick, onSelectItem, infoNoticeText and noItemsRenderer to ContentExplorer', () => {
6767
const onSelectedClick = () => {};
6868
const onSelectItem = () => {};
69-
const wrapper = renderComponent({ onSelectedClick, onSelectItem });
69+
const infoNoticeText = 'info notice text';
70+
const noItemsRenderer = () => <div>No items</div>;
71+
72+
const wrapper = renderComponent({ onSelectedClick, onSelectItem, infoNoticeText, noItemsRenderer });
73+
7074
expect(wrapper.find('ContentExplorer').prop('onSelectedClick')).toEqual(onSelectedClick);
7175
expect(wrapper.find('ContentExplorer').prop('onSelectItem')).toEqual(onSelectItem);
72-
});
73-
74-
test('should pass infoNoticeText to ContentExplorer', () => {
75-
const infoNoticeText = 'info notice text';
76-
const wrapper = renderComponent({ infoNoticeText });
7776
expect(wrapper.find('ContentExplorer').prop('infoNoticeText')).toEqual(infoNoticeText);
77+
expect(wrapper.find('ContentExplorer').prop('noItemsRenderer')).toEqual(noItemsRenderer);
7878
});
7979
});
8080
});

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,8 @@ class ContentExplorer extends Component {
161161
searchInputProps: PropTypes.object,
162162
/** Text for the informational notice, defaults to empty string, which makes notice not visible */
163163
infoNoticeText: PropTypes.string,
164+
/** Used to render the no items state. Overrides the default no items state. */
165+
noItemsRenderer: PropTypes.func,
164166
};
165167

166168
static defaultProps = {
@@ -500,6 +502,7 @@ class ContentExplorer extends Component {
500502
listHeight,
501503
searchInputProps,
502504
infoNoticeText,
505+
noItemsRenderer,
503506
...rest
504507
} = this.props;
505508
const { isInSearchMode, foldersPath, isSelectAllChecked } = this.state;
@@ -600,7 +603,7 @@ class ContentExplorer extends Component {
600603
itemNameLinkRenderer={itemNameLinkRenderer}
601604
items={items}
602605
itemRowRenderer={itemRowRenderer}
603-
noItemsRenderer={this.renderItemListEmptyState}
606+
noItemsRenderer={noItemsRenderer || this.renderItemListEmptyState}
604607
numItemsPerPage={numItemsPerPage}
605608
numTotalItems={numTotalItems}
606609
onItemClick={this.handleItemClick}

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

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -579,6 +579,27 @@ describe('features/content-explorer/content-explorer/ContentExplorer', () => {
579579
});
580580
});
581581

582+
describe('noItemsRenderer', () => {
583+
const customEmptyStateClassName = 'custom-empty-state';
584+
585+
test('should render custom empty state when specified', () => {
586+
const wrapper = renderComponent(
587+
{ noItemsRenderer: () => <div className={customEmptyStateClassName} /> },
588+
true,
589+
);
590+
591+
expect(wrapper.exists(`.${customEmptyStateClassName}`)).toBe(true);
592+
expect(wrapper.exists('ContentExplorerEmptyState')).toBe(false);
593+
});
594+
595+
test('should render default empty state when not specified', () => {
596+
const wrapper = renderComponent({}, true);
597+
598+
expect(wrapper.exists('ContentExplorerEmptyState')).toBe(true);
599+
expect(wrapper.exists(`.${customEmptyStateClassName}`)).toBe(false);
600+
});
601+
});
602+
582603
describe('handleDocumentClick', () => {
583604
test('should deselect when the click did not occur inside the content explorer and not in multi select mode', () => {
584605
const item = { id: 'id', name: 'name' };

0 commit comments

Comments
 (0)