From e306afcd77e68cd963f74a9c0ee03492357f92d2 Mon Sep 17 00:00:00 2001 From: Jo Lillie Date: Wed, 9 Mar 2022 09:15:54 +0000 Subject: [PATCH] (CISC-2409) Quick filter with no options --- package-lock.json | 5 + package.json | 4 +- .../__snapshots__/quickFitler.test.jsx.snap | 208 +++++++++++++++++- .../src/__test__/quickFitler.test.jsx | 37 +++- .../data-grid/src/quickFilter/QuickFilter.jsx | 31 ++- .../data-grid/src/quickFilter/QuickFilter.md | 6 +- .../src/quickFilter/QuickFilter.scss | 15 +- packages/data-grid/src/quickFilter/README.md | 88 ++++++++ 8 files changed, 379 insertions(+), 15 deletions(-) create mode 100644 packages/data-grid/src/quickFilter/README.md diff --git a/package-lock.json b/package-lock.json index 2c6f1e66f..309229f34 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1706,6 +1706,11 @@ } } }, + "classnames": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.1.tgz", + "integrity": "sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA==" + }, "cli-cursor": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", diff --git a/package.json b/package.json index ca3f49c7d..14d3839f3 100644 --- a/package.json +++ b/package.json @@ -19,5 +19,7 @@ "engines": { "node": "12.4.0" }, - "dependencies": {} + "dependencies": { + "classnames": "^2.3.1" + } } diff --git a/packages/data-grid/src/__test__/__snapshots__/quickFitler.test.jsx.snap b/packages/data-grid/src/__test__/__snapshots__/quickFitler.test.jsx.snap index ad2ef588b..9842b7f44 100644 --- a/packages/data-grid/src/__test__/__snapshots__/quickFitler.test.jsx.snap +++ b/packages/data-grid/src/__test__/__snapshots__/quickFitler.test.jsx.snap @@ -2,6 +2,7 @@ exports[`Snapshot test Check component matches previous HTML snapshot 1`] = `
@@ -409,7 +415,7 @@ exports[`Snapshot test Check component matches previous HTML snapshot 1`] = `
@@ -760,6 +766,196 @@ exports[`Snapshot test Check component matches previous HTML snapshot 1`] = `
+ + +
+ + + +
+
    + +
  • + + test empty filter label + +
  • +
    +
+
+
+
+
+
diff --git a/packages/data-grid/src/__test__/quickFitler.test.jsx b/packages/data-grid/src/__test__/quickFitler.test.jsx index fa008ff4c..40755e5c9 100644 --- a/packages/data-grid/src/__test__/quickFitler.test.jsx +++ b/packages/data-grid/src/__test__/quickFitler.test.jsx @@ -48,22 +48,53 @@ const filters = [ }, ], }, + { + fieldLabel: 'Empty filter', + field: 'Empty-array', + options: [], + }, ]; +const emptyFilterLabel = 'test empty filter label'; + const mockfunc = jest.fn(); const wrapper = mount( - , + , ); - describe('Snapshot test', () => { test('Check component matches previous HTML snapshot', () => { expect(wrapper).toMatchSnapshot(); }); }); +describe('Check total number of quick filters', () => { + test('Number of quick filters rendered', () => { + expect(wrapper.find('div.dg-quick-filter-filter')).toHaveLength(3); + }); +}); + +describe('Check number of empty quick filters', () => { + test('Number of empty quick filters rendered', () => { + expect(wrapper.find('div.dg-quick-filter-empty')).toHaveLength(1); + }); + + test('Empty filter label text', () => { + expect( + wrapper + .find('div.dg-quick-filter-empty') + .find('span.rc-menu-list-item-content') + .text(), + ).toEqual('test empty filter label'); + }); +}); + describe('Check component', () => { test('Number of dropdowns rendered ', () => { - expect(wrapper.find('ButtonSelect.dg-quick-filter')).toHaveLength(4); + expect(wrapper.find('ButtonSelect.dg-quick-filter')).toHaveLength(6); }); test('onFilterSelect function gets called', () => { diff --git a/packages/data-grid/src/quickFilter/QuickFilter.jsx b/packages/data-grid/src/quickFilter/QuickFilter.jsx index db70952d6..6e54e44bb 100644 --- a/packages/data-grid/src/quickFilter/QuickFilter.jsx +++ b/packages/data-grid/src/quickFilter/QuickFilter.jsx @@ -1,4 +1,5 @@ import React from 'react'; +import classnames from 'classnames'; import { arrayOf, shape, func, string } from 'prop-types'; import { ButtonSelect } from '@puppet/react-components'; import './QuickFilter.scss'; @@ -27,20 +28,43 @@ const propTypes = { ).isRequired, /** Function called whenever a user clicks an action */ onFilterSelect: func.isRequired, + /** Text which will be displayed if there are no options to filter by */ + emptyFilterLabel: string, }; -function QuickFilter({ filters, onFilterSelect }) { +const defaultProps = { + emptyFilterLabel: 'No items to filter by', +}; + +function QuickFilter({ filters, onFilterSelect, emptyFilterLabel }) { + /** Used for the options array when there is no items to filter by */ + const emptyFilterOption = [ + { + label: emptyFilterLabel, + disabled: true, + value: '', + }, + ]; + return (
{filters.map((filter, idx) => { return ( onFilterSelect(filter.field, filter.fieldLabel, value) @@ -54,5 +78,6 @@ function QuickFilter({ filters, onFilterSelect }) { } QuickFilter.propTypes = propTypes; +QuickFilter.defaultProps = defaultProps; export default QuickFilter; diff --git a/packages/data-grid/src/quickFilter/QuickFilter.md b/packages/data-grid/src/quickFilter/QuickFilter.md index 5c57c2e47..5b9f09d67 100644 --- a/packages/data-grid/src/quickFilter/QuickFilter.md +++ b/packages/data-grid/src/quickFilter/QuickFilter.md @@ -49,9 +49,13 @@ const filters = [ }, ], }, + { + fieldLabel: 'Empty filter', + field: 'Empty-array', + options: [], + }, ]; - { + console.log('A filter was picked', filter, filterLabel, value) +} + +const filters = [ + { + fieldLabel: 'All Operating System', + field: 'All-Operating-System', + options: [ + { + value: 'linux', + icon: 'pencil', + label: 'linux', + }, + { + value: 'Windows', + icon: 'send', + label: 'Windows', + }, + { + value: 'MacOS', + label: 'MacOS', + icon: 'link', + }, + ], + }, + { + fieldLabel: 'Puppet installed', + field: 'Puppet-installed', + options: [ + { + value: 'True', + icon: 'pencil', + label: 'True', + }, + { + value: 'False', + icon: 'send', + label: 'False', + }, + { + value: 'Unknown', + label: 'Unknown', + icon: 'link', + }, + ], + }, +]; + + +``` + +### Empty State + +Where there is no items to filter by, resulting in an empty array for the filters options, the quick filter will be displayed in its empty state. This is defined by `emptyFilterOption` with an `emptyFilterLabel` message displayed to the user which can be customized. This is not clickable and by default this message is "No items to filter by". + +```jsx +const filters = [ + { + fieldLabel: 'Empty filter', + field: 'Empty-array', + options: [], + }, +]; + +const emptyFilterLabel = 'No items to filter by'; + + const emptyFilterOption = [ + { + label: emptyFilterLabel, + disabled: true, + value: '', + }, + ]; + + ; + ```