diff --git a/CHANGELOG.md b/CHANGELOG.md index 11df3001..3e43d40c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,7 +9,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/). ### Added - Include duration for each test step ([#396](https://github.com/cucumber/react-components/pull/396)) - Include pass rate in execution summary ([#397](https://github.com/cucumber/react-components/pull/397)) -- Add new `` component ([#410](https://github.com/cucumber/react-components/pull/410)) +- Add new `` component ([#410](https://github.com/cucumber/react-components/pull/410)) ([#411](https://github.com/cucumber/react-components/pull/411)) - Add new `` component and include in report ([#408](https://github.com/cucumber/react-components/pull/408)) ### Changed @@ -21,6 +21,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/). ### Removed - BREAKING CHANGE: Remove defunct scenario/step components ``, ``, ``, ``, ``, `` and their corresponding `CustomRenderingSupport` properties ([#396](https://github.com/cucumber/react-components/pull/396)) +- BREAKING CHANGE: Remove defunct `` component ([#411](https://github.com/cucumber/react-components/pull/411)) - BREAKING CHANGE: Remove defunct `` component and underlying context ([#396](https://github.com/cucumber/react-components/pull/396)) - BREAKING CHANGE: Remove `` component in favour of using standard Gherkin components for Markdown documents ([#396](https://github.com/cucumber/react-components/pull/396)) diff --git a/src/SearchContext.ts b/src/SearchContext.ts index 380dc042..4078a165 100644 --- a/src/SearchContext.ts +++ b/src/SearchContext.ts @@ -7,11 +7,13 @@ export interface SearchState { } export interface SearchContextValue extends SearchState { + unchanged: boolean update: (changes: Partial) => void } export default React.createContext({ query: '', hideStatuses: [], + unchanged: true, update: () => {}, }) diff --git a/src/components/app/ControlledSearchProvider.tsx b/src/components/app/ControlledSearchProvider.tsx index d52c353d..e0ee3b61 100644 --- a/src/components/app/ControlledSearchProvider.tsx +++ b/src/components/app/ControlledSearchProvider.tsx @@ -13,9 +13,11 @@ export const ControlledSearchProvider: FC> = ({ children, }) => { const contextValue: SearchContextValue = useMemo(() => { + const unchanged = !value.query && !value.hideStatuses.length return { query: value.query, hideStatuses: value.hideStatuses, + unchanged, update: (newValues: Partial) => { onChange({ ...value, ...newValues }) }, diff --git a/src/components/app/FilteredDocuments.module.scss b/src/components/app/FilteredDocuments.module.scss new file mode 100644 index 00000000..e1d607c7 --- /dev/null +++ b/src/components/app/FilteredDocuments.module.scss @@ -0,0 +1,3 @@ +.empty { + font-style: italic; +} diff --git a/src/components/app/FilteredDocuments.spec.tsx b/src/components/app/FilteredDocuments.spec.tsx index 14599a41..bccfb389 100644 --- a/src/components/app/FilteredDocuments.spec.tsx +++ b/src/components/app/FilteredDocuments.spec.tsx @@ -74,7 +74,7 @@ describe('FilteredDocuments', () => { ) await waitFor(() => { - expect(getByText('No matches found for your query and/or filters')).to.be.visible + expect(getByText('No scenarios match your query and/or filters.')).to.be.visible }) }) @@ -119,7 +119,7 @@ describe('FilteredDocuments', () => { name: 'samples/examples-tables/examples-tables.feature', }) ).not.to.exist - expect(getByText('No matches found for your query and/or filters')).to.be.visible + expect(getByText('No scenarios match your query and/or filters.')).to.be.visible }) }) }) diff --git a/src/components/app/FilteredDocuments.tsx b/src/components/app/FilteredDocuments.tsx index f26ee49b..3cd787d9 100644 --- a/src/components/app/FilteredDocuments.tsx +++ b/src/components/app/FilteredDocuments.tsx @@ -1,16 +1,20 @@ import React, { FC } from 'react' import { useFilteredDocuments } from '../../hooks/useFilteredDocuments.js' +import styles from './FilteredDocuments.module.scss' import { GherkinDocumentList } from './GherkinDocumentList.js' -import { NoMatchResult } from './NoMatchResult.js' export const FilteredDocuments: FC = () => { - const filtered = useFilteredDocuments() + const { results, filtered } = useFilteredDocuments() - if (!filtered) { + if (!results) { return null - } else if (!filtered.length) { - return + } else if (!results.length) { + return filtered ? ( +

No scenarios match your query and/or filters.

+ ) : ( +

No scenarios were executed.

+ ) } - return + return } diff --git a/src/components/app/NoMatchResult.module.scss b/src/components/app/NoMatchResult.module.scss deleted file mode 100644 index 6b0044b9..00000000 --- a/src/components/app/NoMatchResult.module.scss +++ /dev/null @@ -1,13 +0,0 @@ -.message { - display: flex; - flex-direction: column; - align-items: center; - gap: 0.5em; - padding-bottom: 1.5em; - text-align: center; -} - -.icon { - font-size: 3em; - opacity: 0.125; -} diff --git a/src/components/app/NoMatchResult.tsx b/src/components/app/NoMatchResult.tsx deleted file mode 100644 index 821dcd1a..00000000 --- a/src/components/app/NoMatchResult.tsx +++ /dev/null @@ -1,14 +0,0 @@ -import { faGrimace } from '@fortawesome/free-solid-svg-icons' -import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' -import React, { FC } from 'react' - -import styles from './NoMatchResult.module.scss' - -export const NoMatchResult: FC = () => { - return ( -

-

- ) -} diff --git a/src/components/app/Report.module.scss b/src/components/app/Report.module.scss index d414738c..b8d3c8f4 100644 --- a/src/components/app/Report.module.scss +++ b/src/components/app/Report.module.scss @@ -3,3 +3,8 @@ margin-bottom: 1.5em; } } + +.heading { + font-size: 1.25em; + margin: 1em 0; +} diff --git a/src/components/app/Report.tsx b/src/components/app/Report.tsx index 7cf3efec..2468e797 100644 --- a/src/components/app/Report.tsx +++ b/src/components/app/Report.tsx @@ -14,9 +14,11 @@ export const Report: FC = () => {
+

Scenarios

+

Hooks

diff --git a/src/components/app/index.ts b/src/components/app/index.ts index f73e703d..890c590d 100644 --- a/src/components/app/index.ts +++ b/src/components/app/index.ts @@ -6,7 +6,6 @@ export * from './FilteredDocuments.js' export * from './GherkinDocumentList.js' export * from './HighLight.js' export * from './InMemorySearchProvider.js' -export * from './NoMatchResult.js' export * from './QueriesProvider.js' export * from './Report.js' export * from './SearchBar.js' diff --git a/src/hooks/useFilteredDocuments.ts b/src/hooks/useFilteredDocuments.ts index 9240e2f3..fcceadb2 100644 --- a/src/hooks/useFilteredDocuments.ts +++ b/src/hooks/useFilteredDocuments.ts @@ -7,8 +7,11 @@ import statuses from '../statuses.js' import { useQueries } from './useQueries.js' import { useSearch } from './useSearch.js' -export function useFilteredDocuments(): GherkinDocument[] | undefined { - const { query, hideStatuses } = useSearch() +export function useFilteredDocuments(): { + results: GherkinDocument[] | undefined + filtered: boolean +} { + const { query, hideStatuses, unchanged } = useSearch() const { gherkinQuery, cucumberQuery } = useQueries() const [searchable, setSearchable] = useState() const [results, setResults] = useState() @@ -36,5 +39,8 @@ export function useFilteredDocuments(): GherkinDocument[] | undefined { } ) }, [query, hideStatuses, gherkinQuery, cucumberQuery, searchable]) - return results + return { + results, + filtered: !unchanged, + } }