From a5fe810e7f045b80151c2c3fd891f4392dba8dea Mon Sep 17 00:00:00 2001 From: Lukas Harbarth Date: Fri, 5 Sep 2025 14:23:07 +0200 Subject: [PATCH 1/7] feat(AnalyticalTable): add `noDataReason` prop to `NoDataComponent` --- .../defaults/NoDataComponent/index.tsx | 8 +++----- .../main/src/components/AnalyticalTable/index.tsx | 15 +++++++++++---- .../src/components/AnalyticalTable/types/index.ts | 7 ++++++- .../main/src/enums/AnalyticalTableNoDataReason.ts | 13 +++++++++++++ 4 files changed, 33 insertions(+), 10 deletions(-) create mode 100644 packages/main/src/enums/AnalyticalTableNoDataReason.ts diff --git a/packages/main/src/components/AnalyticalTable/defaults/NoDataComponent/index.tsx b/packages/main/src/components/AnalyticalTable/defaults/NoDataComponent/index.tsx index 89f9f32edbf..215bbf083f6 100644 --- a/packages/main/src/components/AnalyticalTable/defaults/NoDataComponent/index.tsx +++ b/packages/main/src/components/AnalyticalTable/defaults/NoDataComponent/index.tsx @@ -1,9 +1,7 @@ -interface NoDataComponentProps { - noDataText: string; - className: string; -} +import type { AnalyticalTablePropTypes } from '../../types/index.js'; -export const DefaultNoDataComponent = ({ noDataText, className }: NoDataComponentProps) => { +export const DefaultNoDataComponent: AnalyticalTablePropTypes['NoDataComponent'] = (props) => { + const { noDataText, className } = props; return (
{noDataText} diff --git a/packages/main/src/components/AnalyticalTable/index.tsx b/packages/main/src/components/AnalyticalTable/index.tsx index a2bae2c6988..0f710de2e9f 100644 --- a/packages/main/src/components/AnalyticalTable/index.tsx +++ b/packages/main/src/components/AnalyticalTable/index.tsx @@ -24,6 +24,7 @@ import { useSortBy, useTable, } from 'react-table'; +import { AnalyticalTableNoDataReason } from '../../enums/AnalyticalTableNoDataReason.js'; import { AnalyticalTablePopinDisplay } from '../../enums/AnalyticalTablePopinDisplay.js'; import { AnalyticalTableScaleWidthMode } from '../../enums/AnalyticalTableScaleWidthMode.js'; import { AnalyticalTableSelectionBehavior } from '../../enums/AnalyticalTableSelectionBehavior.js'; @@ -85,9 +86,9 @@ import type { AnalyticalTableDomRef, AnalyticalTablePropTypes, AnalyticalTableState, + CellInstance, DivWithCustomScrollProp, TableInstance, - CellInstance, } from './types/index.js'; import { getCombinedElementsHeight, @@ -325,8 +326,8 @@ const AnalyticalTable = forwardRef 0 || tableState.globalFilter ? noDataTextFiltered : noDataTextI18n); + const noDataFiltered = tableState.filters?.length > 0 || tableState.globalFilter; + const noDataTextLocal = noDataText ?? (noDataFiltered ? noDataTextFiltered : noDataTextI18n); const [componentRef, analyticalTableRef] = useSyncRef(ref); const [cbRef, scrollToRef] = useScrollToRef(componentRef, dispatch); @@ -844,7 +845,13 @@ const AnalyticalTable = forwardRef ) : ( - + )}
)} diff --git a/packages/main/src/components/AnalyticalTable/types/index.ts b/packages/main/src/components/AnalyticalTable/types/index.ts index 80846e5c3b5..d2ac161b613 100644 --- a/packages/main/src/components/AnalyticalTable/types/index.ts +++ b/packages/main/src/components/AnalyticalTable/types/index.ts @@ -10,6 +10,7 @@ import type { RefObject, SetStateAction, } from 'react'; +import type { AnalyticalTableNoDataReason } from '../../../enums/AnalyticalTableNoDataReason.js'; import type { AnalyticalTablePopinDisplay } from '../../../enums/AnalyticalTablePopinDisplay.js'; import type { AnalyticalTableScaleWidthMode } from '../../../enums/AnalyticalTableScaleWidthMode.js'; import type { AnalyticalTableScrollMode } from '../../../enums/AnalyticalTableScrollMode.js'; @@ -1040,7 +1041,11 @@ export interface AnalyticalTablePropTypes extends Omit { * * @default DefaultNoDataComponent */ - NoDataComponent?: ComponentType; + NoDataComponent?: ComponentType<{ + noDataText: string; + className: string; + noDataReason: AnalyticalTableNoDataReason | keyof typeof AnalyticalTableNoDataReason; + }>; /** * Exposes the internal table instance. diff --git a/packages/main/src/enums/AnalyticalTableNoDataReason.ts b/packages/main/src/enums/AnalyticalTableNoDataReason.ts new file mode 100644 index 00000000000..2692223b949 --- /dev/null +++ b/packages/main/src/enums/AnalyticalTableNoDataReason.ts @@ -0,0 +1,13 @@ +/** + * Different reasons why the `NoDataComponent` is displayed. + */ +export enum AnalyticalTableNoDataReason { + /* + * No data was passed to the table. + */ + Empty = 'Empty', + /* + * No results match the applied filters. + */ + Filtered = 'Filtered', +} From dcd1f120cb291ad0b2cbe26c64a3bb1cb9da3b71 Mon Sep 17 00:00:00 2001 From: Lukas Harbarth Date: Mon, 29 Sep 2025 10:58:36 +0200 Subject: [PATCH 2/7] expose `AnalyticalTableNoDataReason` in root barrel --- packages/main/src/enums/index.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/main/src/enums/index.ts b/packages/main/src/enums/index.ts index 3b1d431dabe..960e4ecf3be 100644 --- a/packages/main/src/enums/index.ts +++ b/packages/main/src/enums/index.ts @@ -1,3 +1,4 @@ +export * from './AnalyticalTableNoDataReason.js'; export * from './AnalyticalTablePopinDisplay.js'; export * from './AnalyticalTableScaleWidthMode.js'; export * from './AnalyticalTableScrollMode.js'; From e4513106703879cbd38ac80e4103a486329bfe7b Mon Sep 17 00:00:00 2001 From: Lukas Harbarth Date: Mon, 6 Oct 2025 08:58:25 +0200 Subject: [PATCH 3/7] add `role` --- .../AnalyticalTable/defaults/NoDataComponent/index.tsx | 4 ++-- packages/main/src/components/AnalyticalTable/index.tsx | 1 + packages/main/src/components/AnalyticalTable/types/index.ts | 1 + 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/main/src/components/AnalyticalTable/defaults/NoDataComponent/index.tsx b/packages/main/src/components/AnalyticalTable/defaults/NoDataComponent/index.tsx index 215bbf083f6..5393e85b1f3 100644 --- a/packages/main/src/components/AnalyticalTable/defaults/NoDataComponent/index.tsx +++ b/packages/main/src/components/AnalyticalTable/defaults/NoDataComponent/index.tsx @@ -1,9 +1,9 @@ import type { AnalyticalTablePropTypes } from '../../types/index.js'; export const DefaultNoDataComponent: AnalyticalTablePropTypes['NoDataComponent'] = (props) => { - const { noDataText, className } = props; + const { noDataText, className, role } = props; return ( -
+
{noDataText}
); diff --git a/packages/main/src/components/AnalyticalTable/index.tsx b/packages/main/src/components/AnalyticalTable/index.tsx index 0f710de2e9f..b67f651800e 100644 --- a/packages/main/src/components/AnalyticalTable/index.tsx +++ b/packages/main/src/components/AnalyticalTable/index.tsx @@ -851,6 +851,7 @@ const AnalyticalTable = forwardRef )}
diff --git a/packages/main/src/components/AnalyticalTable/types/index.ts b/packages/main/src/components/AnalyticalTable/types/index.ts index 7d348690e41..40410cc4b21 100644 --- a/packages/main/src/components/AnalyticalTable/types/index.ts +++ b/packages/main/src/components/AnalyticalTable/types/index.ts @@ -1045,6 +1045,7 @@ export interface AnalyticalTablePropTypes extends Omit { noDataText: string; className: string; noDataReason: AnalyticalTableNoDataReason | keyof typeof AnalyticalTableNoDataReason; + role: 'gridcell'; }>; /** From 718986aaaf425b779dedfe7940af2f956ef46a52 Mon Sep 17 00:00:00 2001 From: Lukas Harbarth Date: Mon, 6 Oct 2025 09:35:34 +0200 Subject: [PATCH 4/7] update docs --- .../AnalyticalTable.stories.tsx | 30 +++++++++++++++++-- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/packages/main/src/components/AnalyticalTable/AnalyticalTable.stories.tsx b/packages/main/src/components/AnalyticalTable/AnalyticalTable.stories.tsx index 254b03aba9c..f4124f695a9 100644 --- a/packages/main/src/components/AnalyticalTable/AnalyticalTable.stories.tsx +++ b/packages/main/src/components/AnalyticalTable/AnalyticalTable.stories.tsx @@ -5,6 +5,7 @@ import '@ui5/webcomponents-icons/dist/delete.js'; import '@ui5/webcomponents-icons/dist/edit.js'; import '@ui5/webcomponents-icons/dist/settings.js'; import NoDataIllustration from '@ui5/webcomponents-fiori/dist/illustrations/NoData.js'; +import NoFilterResults from '@ui5/webcomponents-fiori/dist/illustrations/NoFilterResults.js'; import { useCallback, useEffect, useMemo, useReducer, useRef, useState } from 'react'; import { AnalyticalTablePopinDisplay, @@ -29,6 +30,8 @@ import { SegmentedButtonItem } from '../../webComponents/SegmentedButtonItem/ind import { Select } from '../../webComponents/Select/index.js'; import { Tag } from '../../webComponents/Tag/index.js'; import { Text } from '../../webComponents/Text/index.js'; +import type { ToggleButtonPropTypes } from '../../webComponents/ToggleButton/index.js'; +import { ToggleButton } from '../../webComponents/ToggleButton/index.js'; import { FlexBox } from '../FlexBox/index.js'; import { ObjectStatus } from '../ObjectStatus/index.js'; import type { AnalyticalTableColumnDefinition, AnalyticalTablePropTypes } from './index.js'; @@ -590,8 +593,16 @@ export const CustomFilter: Story = { export const NoData: Story = { render(args, context) { const [selected, setSelected] = useState('noData'); + const [filtered, setFiltered] = useState(false); const handleChange: SegmentedButtonPropTypes['onSelectionChange'] = (e) => { - setSelected(e.detail.selectedItems[0].dataset.key); + const { key } = e.detail.selectedItems[0].dataset; + setSelected(key); + if (key === 'data') { + setFiltered(false); + } + }; + const handleClick: ToggleButtonPropTypes['onClick'] = (e) => { + setFiltered(!!e.target.pressed); }; return ( @@ -606,13 +617,26 @@ export const NoData: Story = { With Data - + {' '} + |{' '} + + Table filtered + {context.viewMode === 'story' ? ( + selected === 'noData' + ? undefined + : (props) => { + return filtered ? ( + + ) : ( + + ); + } } /> ) : ( From 1bde15e7772a88ab69dddd6f127449a34513e427 Mon Sep 17 00:00:00 2001 From: Lukas Harbarth Date: Mon, 6 Oct 2025 09:49:40 +0200 Subject: [PATCH 5/7] more docs --- .../AnalyticalTable/AnalyticalTable.mdx | 61 +++++++++++++++++++ .../AnalyticalTable.stories.tsx | 45 ++++++-------- 2 files changed, 81 insertions(+), 25 deletions(-) diff --git a/packages/main/src/components/AnalyticalTable/AnalyticalTable.mdx b/packages/main/src/components/AnalyticalTable/AnalyticalTable.mdx index 95dfbef3099..09c5ca59aef 100644 --- a/packages/main/src/components/AnalyticalTable/AnalyticalTable.mdx +++ b/packages/main/src/components/AnalyticalTable/AnalyticalTable.mdx @@ -567,6 +567,67 @@ const TableComponent = () => { +### Code + +
+ +Show static code + +```tsx +function NoDataTable(props) { + const [selected, setSelected] = useState('noData'); + const [filtered, setFiltered] = useState(false); + const handleChange: SegmentedButtonPropTypes['onSelectionChange'] = (e) => { + const { key } = e.detail.selectedItems[0].dataset; + setSelected(key); + if (key === 'data') { + setFiltered(false); + } + }; + const handleClick: ToggleButtonPropTypes['onClick'] = (e) => { + setFiltered(!!e.target.pressed); + }; + + const NoDataComponent: AnalyticalTablePropTypes['NoDataComponent'] = + selected === 'noData' + ? undefined + : (props) => { + return filtered ? ( + + ) : ( + + ); + }; + return ( + <> + + + Default NoData Component + + + IllustratedMessage NoData Component + + + With Data + + {' '} + |{' '} + + Table filtered + + + + ); +} +``` + +
+ ## Kitchen Sink diff --git a/packages/main/src/components/AnalyticalTable/AnalyticalTable.stories.tsx b/packages/main/src/components/AnalyticalTable/AnalyticalTable.stories.tsx index f4124f695a9..9090d1e63bf 100644 --- a/packages/main/src/components/AnalyticalTable/AnalyticalTable.stories.tsx +++ b/packages/main/src/components/AnalyticalTable/AnalyticalTable.stories.tsx @@ -605,6 +605,24 @@ export const NoData: Story = { setFiltered(!!e.target.pressed); }; + const NoDataComponent: AnalyticalTablePropTypes['NoDataComponent'] = + selected === 'noData' + ? undefined + : (props) => { + return filtered ? ( + + ) : ( + + ); + }; + + const tableProps = { + ...args, + data: selected === 'data' ? args.data : [], + globalFilterValue: filtered ? 'Non-existing text' : undefined, + NoDataComponent: NoDataComponent, + }; + return ( <> @@ -623,34 +641,11 @@ export const NoData: Story = { Table filtered {context.viewMode === 'story' ? ( - { - return filtered ? ( - - ) : ( - - ); - } - } - /> + ) : ( <>
- - } - /> + )} From 7fc4c2e4c3286bfa44694625049580dca3d89a97 Mon Sep 17 00:00:00 2001 From: Lukas Harbarth Date: Mon, 6 Oct 2025 09:59:18 +0200 Subject: [PATCH 6/7] rename `role` to `accessibleRole` --- .../main/src/components/AnalyticalTable/AnalyticalTable.mdx | 4 ++-- .../components/AnalyticalTable/AnalyticalTable.stories.tsx | 4 ++-- .../AnalyticalTable/defaults/NoDataComponent/index.tsx | 4 ++-- packages/main/src/components/AnalyticalTable/types/index.ts | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/main/src/components/AnalyticalTable/AnalyticalTable.mdx b/packages/main/src/components/AnalyticalTable/AnalyticalTable.mdx index 09c5ca59aef..77baf0faf0e 100644 --- a/packages/main/src/components/AnalyticalTable/AnalyticalTable.mdx +++ b/packages/main/src/components/AnalyticalTable/AnalyticalTable.mdx @@ -593,9 +593,9 @@ function NoDataTable(props) { ? undefined : (props) => { return filtered ? ( - + ) : ( - + ); }; return ( diff --git a/packages/main/src/components/AnalyticalTable/AnalyticalTable.stories.tsx b/packages/main/src/components/AnalyticalTable/AnalyticalTable.stories.tsx index 9090d1e63bf..74909aa433f 100644 --- a/packages/main/src/components/AnalyticalTable/AnalyticalTable.stories.tsx +++ b/packages/main/src/components/AnalyticalTable/AnalyticalTable.stories.tsx @@ -610,9 +610,9 @@ export const NoData: Story = { ? undefined : (props) => { return filtered ? ( - + ) : ( - + ); }; diff --git a/packages/main/src/components/AnalyticalTable/defaults/NoDataComponent/index.tsx b/packages/main/src/components/AnalyticalTable/defaults/NoDataComponent/index.tsx index 5393e85b1f3..945679fe8f4 100644 --- a/packages/main/src/components/AnalyticalTable/defaults/NoDataComponent/index.tsx +++ b/packages/main/src/components/AnalyticalTable/defaults/NoDataComponent/index.tsx @@ -1,9 +1,9 @@ import type { AnalyticalTablePropTypes } from '../../types/index.js'; export const DefaultNoDataComponent: AnalyticalTablePropTypes['NoDataComponent'] = (props) => { - const { noDataText, className, role } = props; + const { noDataText, className, accessibleRole } = props; return ( -
+
{noDataText}
); diff --git a/packages/main/src/components/AnalyticalTable/types/index.ts b/packages/main/src/components/AnalyticalTable/types/index.ts index 40410cc4b21..33937d4b64a 100644 --- a/packages/main/src/components/AnalyticalTable/types/index.ts +++ b/packages/main/src/components/AnalyticalTable/types/index.ts @@ -1045,7 +1045,7 @@ export interface AnalyticalTablePropTypes extends Omit { noDataText: string; className: string; noDataReason: AnalyticalTableNoDataReason | keyof typeof AnalyticalTableNoDataReason; - role: 'gridcell'; + accessibleRole: 'gridcell'; }>; /** From 694140428afb552f802df99bbfdb199a8c45ba09 Mon Sep 17 00:00:00 2001 From: Lukas Harbarth Date: Mon, 6 Oct 2025 10:00:48 +0200 Subject: [PATCH 7/7] Update index.tsx --- packages/main/src/components/AnalyticalTable/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/main/src/components/AnalyticalTable/index.tsx b/packages/main/src/components/AnalyticalTable/index.tsx index b67f651800e..f6f0c10bc2f 100644 --- a/packages/main/src/components/AnalyticalTable/index.tsx +++ b/packages/main/src/components/AnalyticalTable/index.tsx @@ -851,7 +851,7 @@ const AnalyticalTable = forwardRef )}