@pega/lists-react 9.0.0-build.11.4 → 9.0.0-build.11.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/Core/Components/ContextMenu/ContextMenuContainer.d.ts +6 -15
- package/lib/Core/Components/ContextMenu/ContextMenuContainer.d.ts.map +1 -1
- package/lib/Core/Components/ContextMenu/ContextMenuContainer.js +91 -165
- package/lib/Core/Components/ContextMenu/ContextMenuContainer.js.map +1 -1
- package/lib/Core/Components/GroupRenderer/GroupAdditionalFieldDataModal.d.ts +12 -0
- package/lib/Core/Components/GroupRenderer/GroupAdditionalFieldDataModal.d.ts.map +1 -0
- package/lib/Core/Components/GroupRenderer/GroupAdditionalFieldDataModal.js +62 -0
- package/lib/Core/Components/GroupRenderer/GroupAdditionalFieldDataModal.js.map +1 -0
- package/lib/Core/Components/GroupRenderer/GroupAdditionalInfo.d.ts +33 -0
- package/lib/Core/Components/GroupRenderer/GroupAdditionalInfo.d.ts.map +1 -0
- package/lib/Core/Components/GroupRenderer/GroupAdditionalInfo.js +110 -0
- package/lib/Core/Components/GroupRenderer/GroupAdditionalInfo.js.map +1 -0
- package/lib/Core/Components/GroupRenderer/index.d.ts +22 -0
- package/lib/Core/Components/GroupRenderer/index.d.ts.map +1 -0
- package/lib/Core/Components/{GroupRenderer.js → GroupRenderer/index.js} +85 -125
- package/lib/Core/Components/GroupRenderer/index.js.map +1 -0
- package/lib/Core/Components/TestIdConstants.d.ts +1 -0
- package/lib/Core/Components/TestIdConstants.js +2 -1
- package/lib/Core/Components/TestIdConstants.js.map +1 -1
- package/lib/Core/Components/Virtualise/index.js +7 -1
- package/lib/Core/Components/Virtualise/index.js.map +1 -1
- package/lib/Core/Context/LocalizationContext.d.ts +1 -1
- package/lib/Core/Context/LocalizationContext.d.ts.map +1 -1
- package/lib/Core/Context/LocalizationContext.js.map +1 -1
- package/lib/Core/Views/Table/StyledTableContainer.d.ts.map +1 -1
- package/lib/Core/Views/Table/StyledTableContainer.js +0 -10
- package/lib/Core/Views/Table/StyledTableContainer.js.map +1 -1
- package/lib/Core/Views/Table/TableA11y.d.ts.map +1 -1
- package/lib/Core/Views/Table/TableA11y.js +3 -2
- package/lib/Core/Views/Table/TableA11y.js.map +1 -1
- package/lib/types.d.ts +2 -0
- package/lib/types.d.ts.map +1 -1
- package/lib/types.js.map +1 -1
- package/package.json +7 -7
- package/lib/Core/Components/GroupRenderer.d.ts +0 -31
- package/lib/Core/Components/GroupRenderer.d.ts.map +0 -1
- package/lib/Core/Components/GroupRenderer.js.map +0 -1
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { useMemo } from 'react';
|
|
3
|
+
import styled from 'styled-components';
|
|
4
|
+
import { Text, useModalManager, Button, VisuallyHiddenText } from '@pega/cosmos-react-core';
|
|
5
|
+
import { dateFunctionLabels, FieldType } from 'pega-repeating-structures-core';
|
|
6
|
+
import { ellipsisOverflow } from '@pega/cosmos-react-core/lib/styles/mixins';
|
|
7
|
+
import useTranslate from '../../Hooks/useTranslate';
|
|
8
|
+
import { getFormattedAggregationValue } from '../AggregateMenu';
|
|
9
|
+
import DateValueDisplay from '../DateValueDisplay';
|
|
10
|
+
import RenderingEngine from '../RenderingEngine/RenderCell';
|
|
11
|
+
import { resolveCellComponent, resolveViewComponent } from '../RenderingEngine/ComponentResolverFactory';
|
|
12
|
+
import GlobalContext from '../../Context/GlobalContext';
|
|
13
|
+
import GroupAdditionalFieldDataModal, { isDateLikeField } from './GroupAdditionalFieldDataModal';
|
|
14
|
+
const isAdditionalFieldWithDateFunction = (additionalField) => {
|
|
15
|
+
return 'dateFunction' in additionalField && Boolean(additionalField.dateFunction);
|
|
16
|
+
};
|
|
17
|
+
const ConditionalEllipsisText = styled(Text) `
|
|
18
|
+
${({ ellipsis }) => ellipsis && ellipsisOverflow}
|
|
19
|
+
display: inline-flex;
|
|
20
|
+
min-width: 0;
|
|
21
|
+
`;
|
|
22
|
+
function withGlobalContext(Component) {
|
|
23
|
+
return function WithGlobalContext(props) {
|
|
24
|
+
const globalContext = useMemo(() => ({
|
|
25
|
+
resolveCellComponent,
|
|
26
|
+
resolveViewComponent
|
|
27
|
+
}), []);
|
|
28
|
+
return (_jsx(GlobalContext.Provider, { value: globalContext, children: _jsx(Component, { ...props }) }));
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
export const useFormattedAdditionalFieldData = (additionalFieldData, additionalField, { column, meta, groupHeader }, rendererContext) => {
|
|
32
|
+
const [translate] = useTranslate();
|
|
33
|
+
const { create } = useModalManager();
|
|
34
|
+
if (!column || !meta) {
|
|
35
|
+
return { label: null, renderer: null };
|
|
36
|
+
}
|
|
37
|
+
const { isInstantRender } = column.parent;
|
|
38
|
+
if (isInstantRender) {
|
|
39
|
+
return { label: null, renderer: null };
|
|
40
|
+
}
|
|
41
|
+
const { value, count = 0 } = additionalFieldData || {};
|
|
42
|
+
const { locale, timezone } = meta;
|
|
43
|
+
const { label, field: { type, name: additionalFieldName } } = column;
|
|
44
|
+
const isDateFieldWithDateFunction = isDateLikeField(type) && isAdditionalFieldWithDateFunction(additionalField);
|
|
45
|
+
const dateFunctionLabel = isDateFieldWithDateFunction
|
|
46
|
+
? translate(dateFunctionLabels[additionalField.dateFunction])
|
|
47
|
+
: null;
|
|
48
|
+
// Additional field as aggregation
|
|
49
|
+
if ('aggregation' in additionalField &&
|
|
50
|
+
additionalField.aggregation &&
|
|
51
|
+
type === FieldType.NUMBER) {
|
|
52
|
+
return {
|
|
53
|
+
label: `${label}(${translate(additionalField.aggregation)})`,
|
|
54
|
+
renderer: typeof value === 'string' || typeof value === 'number'
|
|
55
|
+
? getFormattedAggregationValue(value, additionalField.aggregation, column)
|
|
56
|
+
: null
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
// Additional field as Date part
|
|
60
|
+
if (count === 1 && isDateFieldWithDateFunction) {
|
|
61
|
+
return {
|
|
62
|
+
label: `${label}${dateFunctionLabel ? ` (${dateFunctionLabel})` : ''}`,
|
|
63
|
+
renderer: (typeof value === 'string' || typeof value === 'number') && locale && timezone ? (_jsx(DateValueDisplay, { value: value, dateFunction: additionalField.dateFunction, locale: locale, timezone: timezone })) : null
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
// Additional field as normal field but with multiple values.
|
|
67
|
+
if (count > 1) {
|
|
68
|
+
return {
|
|
69
|
+
label: `${label}${dateFunctionLabel ? ` (${dateFunctionLabel})` : ''}`,
|
|
70
|
+
renderer: rendererContext === 'GroupHeader' ? (_jsx(Button, { variant: 'link', onClick: (event) => {
|
|
71
|
+
create(withGlobalContext(GroupAdditionalFieldDataModal), {
|
|
72
|
+
groupHeader,
|
|
73
|
+
additionalField,
|
|
74
|
+
column
|
|
75
|
+
});
|
|
76
|
+
// Stop propagation to avoid group expand/collapse on button click
|
|
77
|
+
event.stopPropagation();
|
|
78
|
+
}, children: translate('Multiple') })) : (translate('Multiple'))
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
// Additional field as normal field.
|
|
82
|
+
column.setExecutionContext(null);
|
|
83
|
+
return {
|
|
84
|
+
label,
|
|
85
|
+
renderer: (_jsx(RenderingEngine, { ...column.getRenderingEngineProps(),
|
|
86
|
+
context: {
|
|
87
|
+
...column.getContext(),
|
|
88
|
+
name: 'GroupAdditionalField',
|
|
89
|
+
getValue: () => value,
|
|
90
|
+
getExecutionContext: () => {
|
|
91
|
+
return {
|
|
92
|
+
getValue: () => ({ ...groupHeader.data, [additionalFieldName]: value }),
|
|
93
|
+
name: 'groupHeader'
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
} }))
|
|
97
|
+
};
|
|
98
|
+
};
|
|
99
|
+
const GroupAdditionalInfo = ({ additionalFieldData, columns, groupHeader, additionalField, rendererContext }) => {
|
|
100
|
+
const { id: fieldId } = additionalFieldData;
|
|
101
|
+
const column = columns.find(c => c.field.id === fieldId);
|
|
102
|
+
const { label, renderer } = useFormattedAdditionalFieldData(additionalFieldData, additionalField, { column: column ?? null, meta: column ? column.parent.meta : null, groupHeader }, rendererContext);
|
|
103
|
+
if (!column || !label || !renderer) {
|
|
104
|
+
return null;
|
|
105
|
+
}
|
|
106
|
+
const isGroupHeaderContext = rendererContext === 'GroupHeader';
|
|
107
|
+
return (_jsxs(_Fragment, { children: [_jsx(VisuallyHiddenText, { children: ', ' }), _jsxs(ConditionalEllipsisText, { ellipsis: isGroupHeaderContext, variant: isGroupHeaderContext ? 'secondary' : undefined, "data-testid": 'additional-field-label', children: [label, ":"] }), _jsx(ConditionalEllipsisText, { ellipsis: isGroupHeaderContext, variant: isGroupHeaderContext ? 'secondary' : undefined, "data-testid": 'additional-field-renderer', children: renderer })] }));
|
|
108
|
+
};
|
|
109
|
+
export default GroupAdditionalInfo;
|
|
110
|
+
//# sourceMappingURL=GroupAdditionalInfo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GroupAdditionalInfo.js","sourceRoot":"","sources":["../../../../Core/Components/GroupRenderer/GroupAdditionalInfo.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useMemo, type ComponentType, type PropsWithChildren } from 'react';\nimport styled from 'styled-components';\n\nimport { Text, useModalManager, Button, VisuallyHiddenText } from '@pega/cosmos-react-core';\nimport { dateFunctionLabels, FieldType, type RsCoreTypes } from 'pega-repeating-structures-core';\nimport { ellipsisOverflow } from '@pega/cosmos-react-core/lib/styles/mixins';\nimport type { DateGroupAdditionalField } from 'pega-repeating-structures-core/lib/types/State.types';\n\nimport useTranslate from '../../Hooks/useTranslate';\nimport { getFormattedAggregationValue } from '../AggregateMenu';\nimport DateValueDisplay from '../DateValueDisplay';\nimport RenderingEngine from '../RenderingEngine/RenderCell';\nimport {\n resolveCellComponent,\n resolveViewComponent\n} from '../RenderingEngine/ComponentResolverFactory';\nimport GlobalContext from '../../Context/GlobalContext';\n\nimport GroupAdditionalFieldDataModal, {\n isDateLikeField,\n type GroupAdditionalFieldData\n} from './GroupAdditionalFieldDataModal';\n\ntype AdditionalFieldRendererContext = 'GroupHeader' | 'GroupHeaderTooltip';\ntype GroupAdditionalInfoProps = {\n additionalFieldData: GroupAdditionalFieldData;\n columns: RsCoreTypes.Column[];\n groupHeader: RsCoreTypes.GroupGenerator;\n additionalField: RsCoreTypes.GroupAdditionalField;\n rendererContext: AdditionalFieldRendererContext;\n};\n\nconst isAdditionalFieldWithDateFunction = (\n additionalField: RsCoreTypes.GroupAdditionalField\n): additionalField is Required<DateGroupAdditionalField> => {\n return 'dateFunction' in additionalField && Boolean(additionalField.dateFunction);\n};\n\nconst ConditionalEllipsisText = styled(Text)<{ ellipsis: boolean }>`\n ${({ ellipsis }) => ellipsis && ellipsisOverflow}\n display: inline-flex;\n min-width: 0;\n`;\n\nfunction withGlobalContext<P>(Component: ComponentType<P>) {\n return function WithGlobalContext(props: PropsWithChildren<P>) {\n const globalContext = useMemo(\n () => ({\n resolveCellComponent,\n resolveViewComponent\n }),\n []\n );\n\n return (\n <GlobalContext.Provider value={globalContext}>\n <Component {...props} />\n </GlobalContext.Provider>\n );\n };\n}\n\nexport const useFormattedAdditionalFieldData = (\n additionalFieldData: GroupAdditionalFieldData,\n additionalField: RsCoreTypes.GroupAdditionalField,\n {\n column,\n meta,\n groupHeader\n }: {\n column: RsCoreTypes.Column | null;\n meta: RsCoreTypes.Meta | null;\n groupHeader: RsCoreTypes.GroupGenerator;\n },\n rendererContext: AdditionalFieldRendererContext\n) => {\n const [translate] = useTranslate();\n const { create } = useModalManager();\n if (!column || !meta) {\n return { label: null, renderer: null };\n }\n\n const { isInstantRender } = column.parent;\n\n if (isInstantRender) {\n return { label: null, renderer: null };\n }\n\n const { value, count = 0 } = additionalFieldData || {};\n const { locale, timezone } = meta;\n const {\n label,\n field: { type, name: additionalFieldName }\n } = column;\n const isDateFieldWithDateFunction =\n isDateLikeField(type) && isAdditionalFieldWithDateFunction(additionalField);\n const dateFunctionLabel = isDateFieldWithDateFunction\n ? translate(dateFunctionLabels[additionalField.dateFunction])\n : null;\n // Additional field as aggregation\n if (\n 'aggregation' in additionalField &&\n additionalField.aggregation &&\n type === FieldType.NUMBER\n ) {\n return {\n label: `${label}(${translate(additionalField.aggregation)})`,\n renderer:\n typeof value === 'string' || typeof value === 'number'\n ? getFormattedAggregationValue(value, additionalField.aggregation, column)\n : null\n };\n }\n\n // Additional field as Date part\n if (count === 1 && isDateFieldWithDateFunction) {\n return {\n label: `${label}${dateFunctionLabel ? ` (${dateFunctionLabel})` : ''}`,\n renderer:\n (typeof value === 'string' || typeof value === 'number') && locale && timezone ? (\n <DateValueDisplay\n value={value}\n dateFunction={additionalField.dateFunction}\n locale={locale}\n timezone={timezone}\n />\n ) : null\n };\n }\n\n // Additional field as normal field but with multiple values.\n if (count > 1) {\n return {\n label: `${label}${dateFunctionLabel ? ` (${dateFunctionLabel})` : ''}`,\n renderer:\n rendererContext === 'GroupHeader' ? (\n <Button\n variant='link'\n onClick={(event: MouseEvent) => {\n create(withGlobalContext(GroupAdditionalFieldDataModal), {\n groupHeader,\n additionalField,\n column\n });\n // Stop propagation to avoid group expand/collapse on button click\n event.stopPropagation();\n }}\n >\n {translate('Multiple')}\n </Button>\n ) : (\n translate('Multiple')\n )\n };\n }\n\n // Additional field as normal field.\n column.setExecutionContext(null);\n return {\n label,\n renderer: (\n <RenderingEngine\n {...{\n ...column.getRenderingEngineProps(),\n context: {\n ...column.getContext(),\n name: 'GroupAdditionalField',\n getValue: () => value,\n getExecutionContext: () => {\n return {\n getValue: () => ({ ...groupHeader.data, [additionalFieldName]: value }),\n name: 'groupHeader'\n };\n }\n }\n }}\n />\n )\n };\n};\n\nconst GroupAdditionalInfo = ({\n additionalFieldData,\n columns,\n groupHeader,\n additionalField,\n rendererContext\n}: GroupAdditionalInfoProps) => {\n const { id: fieldId } = additionalFieldData;\n const column = columns.find(c => c.field.id === fieldId);\n\n const { label, renderer } = useFormattedAdditionalFieldData(\n additionalFieldData,\n additionalField,\n { column: column ?? null, meta: column ? column.parent.meta : null, groupHeader },\n rendererContext\n );\n\n if (!column || !label || !renderer) {\n return null;\n }\n\n const isGroupHeaderContext = rendererContext === 'GroupHeader';\n\n return (\n <>\n {/* For screen readers. */}\n <VisuallyHiddenText>{', '}</VisuallyHiddenText>\n <ConditionalEllipsisText\n ellipsis={isGroupHeaderContext}\n variant={isGroupHeaderContext ? 'secondary' : undefined}\n data-testid='additional-field-label'\n >\n {label}:\n </ConditionalEllipsisText>\n <ConditionalEllipsisText\n ellipsis={isGroupHeaderContext}\n variant={isGroupHeaderContext ? 'secondary' : undefined}\n data-testid='additional-field-renderer'\n >\n {renderer}\n </ConditionalEllipsisText>\n </>\n );\n};\n\nexport default GroupAdditionalInfo;\n"]}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export function GroupName({ view, column, groupHeader, dateFunction, customFunction }: {
|
|
2
|
+
view: any;
|
|
3
|
+
column: any;
|
|
4
|
+
groupHeader: any;
|
|
5
|
+
dateFunction: any;
|
|
6
|
+
customFunction: any;
|
|
7
|
+
}): any;
|
|
8
|
+
declare function GroupHeader({ groupHeader, columns }: {
|
|
9
|
+
groupHeader: any;
|
|
10
|
+
columns: any;
|
|
11
|
+
}): import("react/jsx-runtime").JSX.Element | null;
|
|
12
|
+
declare namespace GroupHeader {
|
|
13
|
+
namespace propTypes {
|
|
14
|
+
let columns: PropTypes.Validator<any[]>;
|
|
15
|
+
let groupHeader: PropTypes.Validator<{
|
|
16
|
+
[x: string]: any;
|
|
17
|
+
}>;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
export default GroupHeader;
|
|
21
|
+
import PropTypes from 'prop-types';
|
|
22
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../Core/Components/GroupRenderer/index.jsx"],"names":[],"mappings":"AA+MA;;;;;;QAwCC;AA2GD;;;mDAqIC;;;;;;;;;;sBAveqB,YAAY"}
|
|
@@ -1,20 +1,19 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
2
|
import PropTypes from 'prop-types';
|
|
3
|
-
import { useRef } from 'react';
|
|
3
|
+
import { useRef, useCallback } from 'react';
|
|
4
4
|
import styled from 'styled-components';
|
|
5
|
-
import {
|
|
5
|
+
import { Icon, Text, MetaList, Tooltip, VisuallyHiddenText, Flex } from '@pega/cosmos-react-core';
|
|
6
6
|
import BareButton from '@pega/cosmos-react-core/lib/components/Button/BareButton';
|
|
7
7
|
import { getGroupFromKey } from 'pega-ui-list-data-apis';
|
|
8
|
-
import { dateFunctionLabels, FieldType } from 'pega-repeating-structures-core';
|
|
9
8
|
import { StyledMetaListItem } from '@pega/cosmos-react-core/lib/components/MetaList/MetaList';
|
|
10
|
-
import { createClassName as cx } from '
|
|
11
|
-
import useTranslate from '
|
|
12
|
-
import { customFunctions, intervalGroupingBoundaries } from '
|
|
13
|
-
import AggregatorCell from '
|
|
14
|
-
import RenderingEngine from '
|
|
15
|
-
import DateValueDisplay from '
|
|
16
|
-
import TestIdConstants from '
|
|
17
|
-
import
|
|
9
|
+
import { createClassName as cx } from '../../Utils';
|
|
10
|
+
import useTranslate from '../../Hooks/useTranslate';
|
|
11
|
+
import { customFunctions, intervalGroupingBoundaries } from '../../constants';
|
|
12
|
+
import AggregatorCell from '../AggregatorCell';
|
|
13
|
+
import RenderingEngine from '../RenderingEngine/RenderCell';
|
|
14
|
+
import DateValueDisplay from '../DateValueDisplay';
|
|
15
|
+
import TestIdConstants from '../TestIdConstants';
|
|
16
|
+
import GroupAdditionalInfo from './GroupAdditionalInfo';
|
|
18
17
|
const groupheaderleftdisplacement = headerLevel => `${(headerLevel.level + 1) * 0.5}rem`;
|
|
19
18
|
/**
|
|
20
19
|
* TODO: remove currentColor style after cosmos fixes the issue
|
|
@@ -143,113 +142,28 @@ const StyledGroupHeader = styled.div `
|
|
|
143
142
|
background-color: var(--group-bg-color);
|
|
144
143
|
}
|
|
145
144
|
`;
|
|
146
|
-
const StyledText = styled(Text) `
|
|
147
|
-
display: inline-flex;
|
|
148
|
-
white-space: nowrap;
|
|
149
|
-
text-overflow: ellipsis;
|
|
150
|
-
overflow: hidden;
|
|
151
|
-
min-width: 0;
|
|
152
|
-
`;
|
|
153
145
|
const StyledMetaList = styled(MetaList) `
|
|
154
146
|
margin-inline-start: 0;
|
|
147
|
+
|
|
148
|
+
/* Overrides default MetaList padding and margin which was causing text-overflow issues */
|
|
149
|
+
margin: 0;
|
|
150
|
+
padding: 0 0.3rem;
|
|
155
151
|
`;
|
|
156
152
|
const GroupAdditionalInfoSeparator = styled(StyledMetaListItem) `
|
|
157
153
|
margin-inline-start: 0.3rem;
|
|
158
154
|
`;
|
|
159
155
|
/**
|
|
160
|
-
*
|
|
161
|
-
*
|
|
162
|
-
*
|
|
163
|
-
*
|
|
164
|
-
*
|
|
156
|
+
* Generates unique ARIA label IDs for accessibility.
|
|
157
|
+
* - groupLabelId: for the group label (e.g., "Status:")
|
|
158
|
+
* - groupNameId: for the group value (e.g., "Open")
|
|
159
|
+
* - additionalInfoIds: for any additional fields shown in the group header
|
|
160
|
+
* These IDs are used in aria-labelledby to improve screen reader support.
|
|
165
161
|
*/
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
* ReturnType<
|
|
172
|
-
* NonNullable<
|
|
173
|
-
* import('pega-repeating-structures-core').RsCoreTypes.ApiContext['fetchGroupedInfo']
|
|
174
|
-
* >
|
|
175
|
-
* >
|
|
176
|
-
* >[number]['additionalFieldsData']
|
|
177
|
-
* >[number]} AdditionalFieldData
|
|
178
|
-
*
|
|
179
|
-
* @typedef {import('pega-repeating-structures-core').RsCoreTypes.Column} Column
|
|
180
|
-
* @typedef {import('pega-repeating-structures-core').RsCoreTypes.Meta} Meta
|
|
181
|
-
* @typedef {import('pega-repeating-structures-core').RsCoreTypes.GroupGenerator} GroupGenerator
|
|
182
|
-
*
|
|
183
|
-
* @param {AdditionalFieldData} additionalFieldData - The data for the additional field.
|
|
184
|
-
* @param {import('pega-repeating-structures-core').RsCoreTypes.GroupAdditionalField} additionalField - The configuration for the additional field.
|
|
185
|
-
* @param {{column: Column, meta: Meta, groupHeader: GroupGenerator}} config - Additional config for formatting.
|
|
186
|
-
* @param {Column} config.column - The column configuration.
|
|
187
|
-
* @param {Meta} config.meta - RS Meta.
|
|
188
|
-
* @param {GroupGenerator} config.groupHeader - The group header data.
|
|
189
|
-
*
|
|
190
|
-
* @returns {{label: string, renderer: ReactNode | string}} An object containing the formatted label and renderer.
|
|
191
|
-
* @returns {string} returns.label - The formatted label for the additional field.
|
|
192
|
-
* @returns {ReactNode | string} returns.renderer - The React component or value to render.
|
|
193
|
-
*/
|
|
194
|
-
const getFormattedAdditionalFieldData = (additionalFieldData, additionalField, { column, meta, groupHeader, translate }) => {
|
|
195
|
-
const { value, count = 0 } = additionalFieldData || {};
|
|
196
|
-
const { aggregation, dateFunction } = additionalField || {};
|
|
197
|
-
const { locale, timezone } = meta;
|
|
198
|
-
const { label, field: { type } } = column;
|
|
199
|
-
// Additional field as aggregation
|
|
200
|
-
if (aggregation && type === FieldType.NUMBER) {
|
|
201
|
-
return {
|
|
202
|
-
label: `${label}(${translate(aggregation)})`,
|
|
203
|
-
renderer: getFormattedAggregationValue(value, aggregation, column)
|
|
204
|
-
};
|
|
205
|
-
}
|
|
206
|
-
// Additional field as Date part
|
|
207
|
-
if (count <= 1 &&
|
|
208
|
-
dateFunction &&
|
|
209
|
-
[FieldType.DATE, FieldType.DATE_TIME, FieldType.DATE_ONLY].includes(type)) {
|
|
210
|
-
return {
|
|
211
|
-
label: `${label}(${translate(dateFunctionLabels[dateFunction])})`,
|
|
212
|
-
renderer: (_jsx(DateValueDisplay, { value: value, dateFunction: dateFunction, locale: locale, timezone: timezone }))
|
|
213
|
-
};
|
|
214
|
-
}
|
|
215
|
-
// Additional field as normal field but with multiple values.
|
|
216
|
-
if (count > 1) {
|
|
217
|
-
return {
|
|
218
|
-
label: `${label}${dateFunction && [FieldType.DATE, FieldType.DATE_TIME, FieldType.DATE_ONLY].includes(type)
|
|
219
|
-
? `(${translate(dateFunctionLabels[dateFunction])})`
|
|
220
|
-
: ''}`,
|
|
221
|
-
renderer: translate('Multiple')
|
|
222
|
-
};
|
|
223
|
-
}
|
|
224
|
-
// Additional field as normal field.
|
|
225
|
-
column.setExecutionContext(null);
|
|
226
|
-
return {
|
|
227
|
-
label,
|
|
228
|
-
renderer: (_jsx(RenderingEngine, { ...column.getRenderingEngineProps(),
|
|
229
|
-
context: {
|
|
230
|
-
...column.getContext(),
|
|
231
|
-
name: 'GroupAdditionalField',
|
|
232
|
-
getValue: () => value,
|
|
233
|
-
getExecutionContext: () => {
|
|
234
|
-
return { getValue: () => groupHeader.data, name: 'groupHeader' };
|
|
235
|
-
}
|
|
236
|
-
} }))
|
|
237
|
-
};
|
|
238
|
-
};
|
|
239
|
-
const GroupAdditionalInfo = ({ additionalFieldData, columns, groupHeader, additionalField }) => {
|
|
240
|
-
const [infoRef, setInfoRef] = useElement(null);
|
|
241
|
-
const [translate] = useTranslate();
|
|
242
|
-
const { id } = additionalFieldData;
|
|
243
|
-
const column = columns.find(c => c.field.id === id);
|
|
244
|
-
if (!column)
|
|
245
|
-
return null;
|
|
246
|
-
const { meta, isInstantRender } = column.parent;
|
|
247
|
-
//
|
|
248
|
-
if (isInstantRender) {
|
|
249
|
-
return null;
|
|
250
|
-
}
|
|
251
|
-
const { label, renderer } = getFormattedAdditionalFieldData(additionalFieldData, additionalField, { column, meta, groupHeader, translate });
|
|
252
|
-
return (_jsxs(_Fragment, { children: [_jsxs(Flex, { container: { gap: 0.5 }, ref: setInfoRef, children: [_jsxs(StyledText, { variant: 'secondary', "data-testid": 'additional-field-label', children: [label, ":"] }), _jsx(StyledText, { variant: 'secondary', "data-testid": 'additional-field-renderer', children: renderer })] }), _jsxs(Tooltip, { smart: true, target: infoRef, showDelay: 'short', hideDelay: 'none', children: [_jsx(Text, { children: `${label}: ` }), _jsx(Text, { children: renderer })] })] }));
|
|
162
|
+
const getAriaLabelIds = (uniqueId, additionalFields) => {
|
|
163
|
+
const groupLabelId = `group-label-${uniqueId}`;
|
|
164
|
+
const groupNameId = `group-name-${uniqueId}`;
|
|
165
|
+
const additionalInfoIds = additionalFields?.map(additionalField => `group-additional-info-${uniqueId}-${additionalField.id}` /* used in aria-labelledby */);
|
|
166
|
+
return { groupLabelId, groupNameId, additionalInfoIds };
|
|
253
167
|
};
|
|
254
168
|
/**
|
|
255
169
|
* Returns label for interval grouping based on interval and boundaries
|
|
@@ -279,7 +193,7 @@ function buildIntervalGroupingLabel(value, customFunction, translate) {
|
|
|
279
193
|
}
|
|
280
194
|
return `${lowerValue} ${translate('to')} ${upperValue}`;
|
|
281
195
|
}
|
|
282
|
-
function GroupName({ view, column, groupHeader, dateFunction, customFunction }) {
|
|
196
|
+
export function GroupName({ view, column, groupHeader, dateFunction, customFunction }) {
|
|
283
197
|
const [translate] = useTranslate();
|
|
284
198
|
const { locale, timezone } = view.meta;
|
|
285
199
|
const isRangeGrouping = customFunction?.type === customFunctions.RANGE_GROUPING;
|
|
@@ -307,39 +221,85 @@ function GroupName({ view, column, groupHeader, dateFunction, customFunction })
|
|
|
307
221
|
};
|
|
308
222
|
return _jsx(RenderingEngine, { ...columnRendererProps });
|
|
309
223
|
}
|
|
224
|
+
/**
|
|
225
|
+
* Tooltip content for the group header.
|
|
226
|
+
* Shows the group label, value, and any additional fields.
|
|
227
|
+
* Used for hover/focus tooltips on the group header button.
|
|
228
|
+
*/
|
|
229
|
+
function GroupHeaderToolTip({ column, groupHeader, columns, additionalFields, target }) {
|
|
230
|
+
const view = column.parent;
|
|
231
|
+
const { dateFunction, customFunction } = getGroupFromKey(groupHeader.groupBy, view.state.groups) ?? {};
|
|
232
|
+
const formatter = view.getFormatterByKey('Integer');
|
|
233
|
+
const { locale } = view.meta;
|
|
234
|
+
const groupCountFormatted = formatter
|
|
235
|
+
? formatter(groupHeader.count, { locale })
|
|
236
|
+
: groupHeader.count;
|
|
237
|
+
return (_jsxs(Tooltip, { smart: true, target: target, showDelay: 'short', hideDelay: 'none', describeTarget: false, children: [_jsxs(Text, { children: [!column.field.hideGroupColumnNameLabel && groupHeader.label, ": "] }), _jsxs(Text, { children: [_jsx(GroupName, { view: view, column: column, groupHeader: groupHeader, dateFunction: dateFunction, customFunction: customFunction }), _jsx(Text, { children: ` (${groupCountFormatted})` })] }), !!(groupHeader.additionalFieldsData?.length && additionalFields.length) && (_jsx(_Fragment, { children: groupHeader.additionalFieldsData?.map(additionalFieldData => {
|
|
238
|
+
return (_jsxs(_Fragment, { children: [' • ', _jsx(GroupAdditionalInfo, { groupHeader: groupHeader, additionalField: additionalFields.find(additionalField => additionalField.id === additionalFieldData.id), columns: columns, additionalFieldData: additionalFieldData, rendererContext: 'GroupHeaderTooltip' })] }));
|
|
239
|
+
}) }))] }));
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* Renders the main group header label and count.
|
|
243
|
+
* - Shows the group label (e.g., "Status:") unless hidden by column config.
|
|
244
|
+
* - Shows the group value and item count.
|
|
245
|
+
* - Uses ARIA IDs for accessibility.
|
|
246
|
+
*/
|
|
247
|
+
function GroupHeaderLabel({ column, groupHeader }) {
|
|
248
|
+
const view = column.parent;
|
|
249
|
+
const { dateFunction, customFunction } = getGroupFromKey(groupHeader.groupBy, view.state.groups) ?? {};
|
|
250
|
+
const formatter = view.getFormatterByKey('Integer');
|
|
251
|
+
const { locale } = view.meta;
|
|
252
|
+
const groupCountFormatted = formatter
|
|
253
|
+
? formatter(groupHeader.count, { locale })
|
|
254
|
+
: groupHeader.count;
|
|
255
|
+
const { groupLabelId, groupNameId } = getAriaLabelIds(groupHeader.uniqueId);
|
|
256
|
+
return (_jsxs(_Fragment, { children: [_jsx("div", { className: 'group-label' }), !column.field.hideGroupColumnNameLabel && (_jsxs("span", { className: 'group-header-groupby', "data-test-id": groupHeader.groupBy, "data-testid": `${TestIdConstants.groupHeaderGroupBy}-${groupHeader.groupBy}`, id: groupLabelId, children: [groupHeader.label, ":"] })), _jsx("div", { className: 'group-label' }), _jsxs("span", { className: 'group-context-count', style: { display: 'inline-flex' }, "data-test-id": 'groupHeader', "data-testid": TestIdConstants.groupHeaderCount, id: groupNameId, children: [_jsx(GroupName, { view: view, column: column, groupHeader: groupHeader, dateFunction: dateFunction, customFunction: customFunction }), _jsx("span", { className: 'group-count', children: ` (${groupCountFormatted})` }), _jsx(VisuallyHiddenText, { children: " items" })] })] }));
|
|
257
|
+
}
|
|
310
258
|
// NOTE: While making any changes in GroupRenderer.jsx, also make similar changes in HierarchicalGroupRenderer.jsx file if applicable
|
|
311
259
|
export default function GroupHeader({ groupHeader, columns }) {
|
|
312
260
|
const buttonRef = useRef();
|
|
261
|
+
const view = columns[0].parent;
|
|
262
|
+
const toggleGroup = useCallback(() => {
|
|
263
|
+
if (groupHeader.count > 0) {
|
|
264
|
+
view.type.toggleGroupExpansion({ groupHeader });
|
|
265
|
+
}
|
|
266
|
+
}, [groupHeader, view]);
|
|
313
267
|
// TODO: This we are adding temporary to show freeze border until we make group header rendering change
|
|
314
268
|
// when we will pick up aggregation.
|
|
315
269
|
if (!groupHeader.isVisible)
|
|
316
270
|
return null;
|
|
317
|
-
const view = columns[0].parent;
|
|
318
271
|
// If grouping by a regular column (i.e. without a dateFunction), determine props for the renderer
|
|
319
|
-
const { columnId,
|
|
272
|
+
const { columnId, additionalFields = [] } = getGroupFromKey(groupHeader.groupBy, view.state.groups) ?? {};
|
|
320
273
|
// if state.groups is not yet prepared/updated, then getGroupFromKey will return undefined
|
|
321
274
|
if (!columnId) {
|
|
322
275
|
return null;
|
|
323
276
|
}
|
|
324
277
|
const column = columns.find(c => c.field.id === columnId);
|
|
325
|
-
const formatter = view.getFormatterByKey('Integer');
|
|
326
|
-
const { locale } = view.meta;
|
|
327
|
-
const groupCountFormatted = formatter
|
|
328
|
-
? formatter(groupHeader.count, { locale })
|
|
329
|
-
: groupHeader.count;
|
|
330
278
|
const isAggregationApplied = columns.filter(c => !c.hidden).some(c => c.aggregated);
|
|
279
|
+
// Generate unique ARIA label IDs for accessibility
|
|
280
|
+
const { groupLabelId, groupNameId, additionalInfoIds = [] } = getAriaLabelIds(groupHeader.uniqueId, additionalFields);
|
|
281
|
+
let groupAdditionalInfo;
|
|
282
|
+
// Prepare additional info components if present
|
|
283
|
+
if (groupHeader.additionalFieldsData?.length && additionalFields.length) {
|
|
284
|
+
groupAdditionalInfo = groupHeader.additionalFieldsData.map((additionalFieldsData, idx) => (_jsx(Flex, { container: { gap: 0.5 }, id: additionalInfoIds[idx], children: _jsx(GroupAdditionalInfo, { additionalFieldData: additionalFieldsData, additionalField: additionalFields.find(additionalField => additionalField.id === additionalFieldsData.id), columns: columns, groupHeader: groupHeader, rendererContext: 'GroupHeader' }) })));
|
|
285
|
+
}
|
|
331
286
|
// FIXME: Import rather than COPY, i would rather
|
|
332
287
|
return (_jsxs(StyledGroupHeader, { groupHeader: groupHeader, className: cx('row group-header-row sticky-group-header'), "data-test-id": 'groupHeader', "data-testid": TestIdConstants.groupHeader, isAggregationApplied: isAggregationApplied, role: 'row', onFocus: e => {
|
|
333
288
|
if (buttonRef.current && !e.currentTarget.contains(e.relatedTarget)) {
|
|
334
289
|
e.preventDefault();
|
|
335
290
|
buttonRef.current.focus();
|
|
336
291
|
}
|
|
337
|
-
}, children: [
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
292
|
+
}, children: [_jsxs("div", { className: 'stickyGroupHeader', children: [_jsxs(BareButton, { ref: buttonRef, "aria-labelledby": [groupLabelId, groupNameId, ...additionalInfoIds].join(' '), "aria-expanded": !!groupHeader.isExpanded, style: {
|
|
293
|
+
paddingRight: 'var(--group-left)'
|
|
294
|
+
}, onClick: () => toggleGroup(), onKeyDown: event => {
|
|
295
|
+
if (event.key === 'Enter') {
|
|
296
|
+
// Prevent capturing of group header toggle click to its child renderers.
|
|
297
|
+
event.preventDefault();
|
|
298
|
+
event.stopPropagation();
|
|
299
|
+
toggleGroup();
|
|
300
|
+
}
|
|
301
|
+
}, tabIndex: -1, icon: true, children: [groupHeader.count > 0 &&
|
|
302
|
+
(groupHeader.isExpanded ? _jsx(Icon, { name: 'caret-down' }) : _jsx(Icon, { name: 'caret-right' })), _jsxs("div", { className: 'group-wrapper', children: [_jsx(GroupHeaderLabel, { column: column, groupHeader: groupHeader }), groupAdditionalInfo && (_jsxs(_Fragment, { children: [_jsx(Text, { variant: 'secondary', as: GroupAdditionalInfoSeparator, children: "\u2022" }), _jsx(StyledMetaList, { wrapItems: false, items: groupAdditionalInfo })] }))] })] }), buttonRef.current && (_jsx(GroupHeaderToolTip, { target: buttonRef.current, column: column, groupHeader: groupHeader, columns: columns, additionalFields: additionalFields }))] }), _jsx("div", { className: 'group-header-aggregation-row', children: columns.map(c => {
|
|
343
303
|
const cxt = {
|
|
344
304
|
getValue: () => groupHeader?.aggregation?.[c.field.name]?.[c.aggregationType?.toLowerCase()]
|
|
345
305
|
};
|
|
@@ -352,4 +312,4 @@ GroupHeader.propTypes = {
|
|
|
352
312
|
columns: PropTypes.arrayOf(PropTypes.any).isRequired,
|
|
353
313
|
groupHeader: PropTypes.objectOf(PropTypes.any).isRequired
|
|
354
314
|
};
|
|
355
|
-
//# sourceMappingURL=
|
|
315
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../Core/Components/GroupRenderer/index.jsx"],"names":[],"mappings":"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","sourcesContent":["import PropTypes from 'prop-types';\nimport { useRef, useCallback } from 'react';\nimport styled from 'styled-components';\n\nimport { Icon, Text, MetaList, Tooltip, VisuallyHiddenText, Flex } from '@pega/cosmos-react-core';\nimport BareButton from '@pega/cosmos-react-core/lib/components/Button/BareButton';\nimport { getGroupFromKey } from 'pega-ui-list-data-apis';\nimport { StyledMetaListItem } from '@pega/cosmos-react-core/lib/components/MetaList/MetaList';\n\nimport { createClassName as cx } from '../../Utils';\nimport useTranslate from '../../Hooks/useTranslate';\nimport { customFunctions, intervalGroupingBoundaries } from '../../constants';\nimport AggregatorCell from '../AggregatorCell';\nimport RenderingEngine from '../RenderingEngine/RenderCell';\nimport DateValueDisplay from '../DateValueDisplay';\nimport TestIdConstants from '../TestIdConstants';\n\nimport GroupAdditionalInfo from './GroupAdditionalInfo';\n\nconst groupheaderleftdisplacement = headerLevel => `${(headerLevel.level + 1) * 0.5}rem`;\n/**\n * TODO: remove currentColor style after cosmos fixes the issue\n * Cosmos yet to handle dark theme on BareButton\n */\n\nconst StyledGroupHeader = styled.div`\n --group-left: ${props => groupheaderleftdisplacement(props.groupHeader)};\n --group-bg-color: ${props => props.theme.base.palette['secondary-background']};\n background-color: var(--group-bg-color);\n &:has(button[aria-expanded='true']) {\n filter: ${props => props.theme.base.shadow['low-filter']};\n }\n\n &.row.sticky-group-header {\n position: sticky;\n display: block;\n top: calc(\n ${props =>\n props.groupHeader.isLeafNode && props.groupHeader.level !== 0\n ? 'calc(var(--row-height) + var(--group-header-height))'\n : 'var(--row-height)'}\n );\n\n /* z-index starting from 8 because freeze-line has z-index 7 */\n z-index: ${props => `${8 + props.groupHeader.index}`};\n > .cell-action,\n .cell-fixed {\n background-color: var(--group-bg-color);\n }\n }\n\n .group-label {\n width: 0.437rem;\n display: inline-block;\n flex-shrink: 0;\n }\n\n .group-header-groupby {\n font-weight: ${props => props.theme.base['font-weight'].normal};\n }\n\n .group-context-count .group-count {\n font-weight: ${props => props.theme.base['font-weight'].bold};\n white-space: pre;\n }\n\n &.row.group-header-row {\n height: auto;\n border-bottom: ${props => (!props.isAggregationApplied ? 'var(--border-style)' : 'none')};\n\n .group-header-aggregation-row {\n display: flex;\n\n /* Using height 0 so that the aggregations aren't visible when not applied but the cells can take the width and stretch the group header to the full width */\n height: ${props => (props.isAggregationApplied ? 'var(--group-header-height)' : 0)};\n\n &::before {\n content: '';\n position: sticky;\n inset-block-start: 0;\n inset-inline-start: 0;\n width: 0.25rem;\n height: 100%;\n background-color: ${props => props.groupHeader.colorIndicator};\n z-index: 12;\n }\n }\n }\n\n &.group-header-row .stickyGroupHeader {\n position: sticky;\n left: 0;\n width: 0;\n z-index: 10;\n height: var(--group-header-height);\n\n > button {\n color: currentColor;\n position: absolute;\n left: 0;\n top: 0;\n bottom: 0;\n width: max-content;\n max-width: var(--container-width);\n display: flex;\n align-items: center;\n background-color: var(--group-bg-color);\n padding-left: var(--group-left);\n margin-inline-start: 0.25rem;\n z-index: 30;\n cursor: pointer;\n white-space: nowrap;\n text-align: inherit;\n font-stretch: inherit;\n\n > .group-wrapper {\n margin-inline-start: ${({ groupHeader, theme }) =>\n groupHeader.count === 0 ? `calc(${theme.base.spacing} * 2.25)` : 'unset'};\n align-items: baseline;\n }\n\n .cell-content {\n max-height: var(--group-header-height);\n padding: 0;\n }\n }\n button:focus {\n box-shadow: ${({ theme }) => theme.base.shadow['focus-inset']};\n }\n\n &::before {\n content: '';\n position: absolute;\n inset-block-start: 0;\n inset-inline-start: 0;\n width: 0.25rem;\n height: 100%;\n background-color: ${props => props.groupHeader.colorIndicator};\n z-index: 12;\n }\n }\n .group-header.cell {\n left: 0;\n padding-left: var(--group-left);\n }\n\n div.group-header.cell-fixed {\n background-color: var(--group-bg-color);\n }\n`;\n\nconst StyledMetaList = styled(MetaList)`\n margin-inline-start: 0;\n\n /* Overrides default MetaList padding and margin which was causing text-overflow issues */\n margin: 0;\n padding: 0 0.3rem;\n`;\nconst GroupAdditionalInfoSeparator = styled(StyledMetaListItem)`\n margin-inline-start: 0.3rem;\n`;\n\n/**\n * Generates unique ARIA label IDs for accessibility.\n * - groupLabelId: for the group label (e.g., \"Status:\")\n * - groupNameId: for the group value (e.g., \"Open\")\n * - additionalInfoIds: for any additional fields shown in the group header\n * These IDs are used in aria-labelledby to improve screen reader support.\n */\nconst getAriaLabelIds = (uniqueId, additionalFields) => {\n const groupLabelId = `group-label-${uniqueId}`;\n const groupNameId = `group-name-${uniqueId}`;\n const additionalInfoIds = additionalFields?.map(\n additionalField =>\n `group-additional-info-${uniqueId}-${additionalField.id}` /* used in aria-labelledby */\n );\n return { groupLabelId, groupNameId, additionalInfoIds };\n};\n/**\n * Returns label for interval grouping based on interval and boundaries\n Response data depends on boundary settings.\n Ex: For sample data of profit\n profit --> cases(count)\n {'0': 10, 1': 100, '2':30, '10': 35, '15':45, '20':2}\n For Interval 10\n If the boundary is 'include-lower-only',\n and value is 10 then label -> 10 to 20\n\n If boundary is 'include-upper-only',\n and value is 10 then label -> 0 to 10\n * */\nfunction buildIntervalGroupingLabel(value, customFunction, translate) {\n const { interval, boundaries } = customFunction;\n // To restrict the decimals in labels\n const intervalDecimalLength = (interval.toString().split('.')[1] || '').length;\n value = Number(value);\n // In case of 'include-lower-only'\n let lowerValue = value.toFixed(intervalDecimalLength);\n let upperValue = (value + interval).toFixed(intervalDecimalLength);\n // In case of boundary 'include-upper-only'\n if (boundaries === intervalGroupingBoundaries.includeUpperOnly) {\n lowerValue = (value - interval).toFixed(intervalDecimalLength);\n upperValue = value.toFixed(intervalDecimalLength);\n }\n return `${lowerValue} ${translate('to')} ${upperValue}`;\n}\n\nexport function GroupName({ view, column, groupHeader, dateFunction, customFunction }) {\n const [translate] = useTranslate();\n const { locale, timezone } = view.meta;\n const isRangeGrouping = customFunction?.type === customFunctions.RANGE_GROUPING;\n const isIntervalGrouping = customFunction?.type === customFunctions.INTERVAL_GROUPING;\n\n if (dateFunction) {\n return (\n <DateValueDisplay\n value={groupHeader.name}\n dateFunction={dateFunction}\n locale={locale}\n timezone={timezone}\n />\n );\n }\n\n if (isRangeGrouping) {\n /** If custom range grouping applied on number field , we need to show group name as text instead of number */\n return groupHeader.name;\n }\n\n if (isIntervalGrouping) {\n /** If custom range grouping applied on number , we need to show group name based on value and custom function details like interval and boundaries */\n return buildIntervalGroupingLabel(groupHeader.name, customFunction, translate);\n }\n\n column.setExecutionContext(null); // If null is not set then it will execute on the previous row context and facing issues when cell is edited. Based on column.editMode and current context renderer varies (it can be cellEditRenderer)\n\n const columnRendererProps = {\n ...column.getRenderingEngineProps(),\n context: {\n getValue: () => groupHeader.name,\n getExecutionContext: () => {\n return { getValue: () => groupHeader.data, name: 'groupHeader' };\n }\n }\n };\n\n return <RenderingEngine {...columnRendererProps} />;\n}\n\n/**\n * Tooltip content for the group header.\n * Shows the group label, value, and any additional fields.\n * Used for hover/focus tooltips on the group header button.\n */\nfunction GroupHeaderToolTip({ column, groupHeader, columns, additionalFields, target }) {\n const view = column.parent;\n const { dateFunction, customFunction } =\n getGroupFromKey(groupHeader.groupBy, view.state.groups) ?? {};\n const formatter = view.getFormatterByKey('Integer');\n const { locale } = view.meta;\n const groupCountFormatted = formatter\n ? formatter(groupHeader.count, { locale })\n : groupHeader.count;\n\n return (\n <Tooltip smart target={target} showDelay='short' hideDelay='none' describeTarget={false}>\n <Text>{!column.field.hideGroupColumnNameLabel && groupHeader.label}: </Text>\n <Text>\n <GroupName\n view={view}\n column={column}\n groupHeader={groupHeader}\n dateFunction={dateFunction}\n customFunction={customFunction}\n />\n <Text>{` (${groupCountFormatted})`}</Text>\n </Text>\n {!!(groupHeader.additionalFieldsData?.length && additionalFields.length) && (\n <>\n {groupHeader.additionalFieldsData?.map(additionalFieldData => {\n return (\n <>\n {' • '}\n <GroupAdditionalInfo\n groupHeader={groupHeader}\n additionalField={additionalFields.find(\n additionalField => additionalField.id === additionalFieldData.id\n )}\n columns={columns}\n additionalFieldData={additionalFieldData}\n rendererContext='GroupHeaderTooltip'\n />\n </>\n );\n })}\n </>\n )}\n </Tooltip>\n );\n}\n\n/**\n * Renders the main group header label and count.\n * - Shows the group label (e.g., \"Status:\") unless hidden by column config.\n * - Shows the group value and item count.\n * - Uses ARIA IDs for accessibility.\n */\nfunction GroupHeaderLabel({ column, groupHeader }) {\n const view = column.parent;\n const { dateFunction, customFunction } =\n getGroupFromKey(groupHeader.groupBy, view.state.groups) ?? {};\n const formatter = view.getFormatterByKey('Integer');\n const { locale } = view.meta;\n const groupCountFormatted = formatter\n ? formatter(groupHeader.count, { locale })\n : groupHeader.count;\n const { groupLabelId, groupNameId } = getAriaLabelIds(groupHeader.uniqueId);\n return (\n <>\n <div className='group-label' />\n {!column.field.hideGroupColumnNameLabel && (\n <span\n className='group-header-groupby'\n data-test-id={groupHeader.groupBy}\n data-testid={`${TestIdConstants.groupHeaderGroupBy}-${groupHeader.groupBy}`}\n id={groupLabelId}\n >\n {groupHeader.label}:\n </span>\n )}\n <div className='group-label' />\n <span\n className='group-context-count'\n style={{ display: 'inline-flex' }}\n data-test-id='groupHeader'\n data-testid={TestIdConstants.groupHeaderCount}\n id={groupNameId}\n >\n <GroupName\n view={view}\n column={column}\n groupHeader={groupHeader}\n dateFunction={dateFunction}\n customFunction={customFunction}\n />\n {/* adding whitespace pre to preserve the space at the begining of count text */}\n <span className='group-count'>{` (${groupCountFormatted})`}</span>\n <VisuallyHiddenText> items</VisuallyHiddenText>\n </span>\n </>\n );\n}\n// NOTE: While making any changes in GroupRenderer.jsx, also make similar changes in HierarchicalGroupRenderer.jsx file if applicable\n\nexport default function GroupHeader({ groupHeader, columns }) {\n const buttonRef = useRef();\n const view = columns[0].parent;\n const toggleGroup = useCallback(() => {\n if (groupHeader.count > 0) {\n view.type.toggleGroupExpansion({ groupHeader });\n }\n }, [groupHeader, view]);\n\n // TODO: This we are adding temporary to show freeze border until we make group header rendering change\n // when we will pick up aggregation.\n if (!groupHeader.isVisible) return null;\n\n // If grouping by a regular column (i.e. without a dateFunction), determine props for the renderer\n const { columnId, additionalFields = [] } =\n getGroupFromKey(groupHeader.groupBy, view.state.groups) ?? {};\n // if state.groups is not yet prepared/updated, then getGroupFromKey will return undefined\n if (!columnId) {\n return null;\n }\n\n const column = columns.find(c => c.field.id === columnId);\n const isAggregationApplied = columns.filter(c => !c.hidden).some(c => c.aggregated);\n\n // Generate unique ARIA label IDs for accessibility\n const {\n groupLabelId,\n groupNameId,\n additionalInfoIds = []\n } = getAriaLabelIds(groupHeader.uniqueId, additionalFields);\n let groupAdditionalInfo;\n\n // Prepare additional info components if present\n if (groupHeader.additionalFieldsData?.length && additionalFields.length) {\n groupAdditionalInfo = groupHeader.additionalFieldsData.map((additionalFieldsData, idx) => (\n <Flex container={{ gap: 0.5 }} id={additionalInfoIds[idx]}>\n <GroupAdditionalInfo\n additionalFieldData={additionalFieldsData}\n additionalField={additionalFields.find(\n additionalField => additionalField.id === additionalFieldsData.id\n )}\n columns={columns}\n groupHeader={groupHeader}\n rendererContext='GroupHeader'\n />\n </Flex>\n ));\n }\n\n // FIXME: Import rather than COPY, i would rather\n return (\n <StyledGroupHeader\n groupHeader={groupHeader}\n className={cx('row group-header-row sticky-group-header')}\n data-test-id='groupHeader'\n data-testid={TestIdConstants.groupHeader}\n isAggregationApplied={isAggregationApplied}\n role='row'\n onFocus={e => {\n if (buttonRef.current && !e.currentTarget.contains(e.relatedTarget)) {\n e.preventDefault();\n buttonRef.current.focus();\n }\n }}\n >\n <div className='stickyGroupHeader'>\n <BareButton\n ref={buttonRef}\n // ARIA labels for accessibility, includes additional info if present\n aria-labelledby={[groupLabelId, groupNameId, ...additionalInfoIds].join(' ')}\n aria-expanded={!!groupHeader.isExpanded}\n style={{\n paddingRight: 'var(--group-left)'\n }}\n onClick={() => toggleGroup()}\n onKeyDown={event => {\n if (event.key === 'Enter') {\n // Prevent capturing of group header toggle click to its child renderers.\n event.preventDefault();\n event.stopPropagation();\n toggleGroup();\n }\n }}\n tabIndex={-1}\n icon\n >\n {groupHeader.count > 0 &&\n (groupHeader.isExpanded ? <Icon name='caret-down' /> : <Icon name='caret-right' />)}\n <div className='group-wrapper'>\n {/* Main group label and count */}\n <GroupHeaderLabel column={column} groupHeader={groupHeader} />\n {/* Render additional info if present */}\n {groupAdditionalInfo && (\n <>\n <Text variant='secondary' as={GroupAdditionalInfoSeparator}>\n •\n </Text>\n <StyledMetaList wrapItems={false} items={groupAdditionalInfo} />\n </>\n )}\n </div>\n </BareButton>\n {/* Tooltip for group header, shown on hover/focus */}\n {buttonRef.current && (\n <GroupHeaderToolTip\n target={buttonRef.current}\n column={column}\n groupHeader={groupHeader}\n columns={columns}\n additionalFields={additionalFields}\n />\n )}\n </div>\n <div className='group-header-aggregation-row'>\n {columns.map(c => {\n const cxt = {\n getValue: () =>\n groupHeader?.aggregation?.[c.field.name]?.[c.aggregationType?.toLowerCase()]\n };\n return (\n <AggregatorCell\n key={c.field.id}\n column={c}\n context={cxt}\n className={cx('cell', {\n 'cell-fixed': column.frozen\n })}\n />\n );\n })}\n </div>\n </StyledGroupHeader>\n );\n}\n\nGroupHeader.propTypes = {\n columns: PropTypes.arrayOf(PropTypes.any).isRequired,\n groupHeader: PropTypes.objectOf(PropTypes.any).isRequired\n};\n"]}
|
|
@@ -9,6 +9,7 @@ export default {
|
|
|
9
9
|
groupHeader: 'group-header',
|
|
10
10
|
groupHeaderCount: 'group-header-count',
|
|
11
11
|
groupHeaderGroupBy: 'group-header-group-by',
|
|
12
|
-
hierarchicalCell: 'hierarchical-cell'
|
|
12
|
+
hierarchicalCell: 'hierarchical-cell',
|
|
13
|
+
contextMenu: 'repeat-context-menu'
|
|
13
14
|
};
|
|
14
15
|
//# sourceMappingURL=TestIdConstants.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TestIdConstants.js","sourceRoot":"","sources":["../../../Core/Components/TestIdConstants.js"],"names":[],"mappings":"AAAA,eAAe;IACb,YAAY,EAAE,sBAAsB;IACpC,WAAW,EAAE,qBAAqB;IAClC,UAAU,EAAE,oBAAoB;IAChC,iBAAiB,EAAE,4BAA4B;IAC/C,SAAS,EAAE,mBAAmB;IAC9B,qBAAqB,EAAE,yBAAyB;IAChD,gBAAgB,EAAE,oBAAoB;IACtC,WAAW,EAAE,cAAc;IAC3B,gBAAgB,EAAE,oBAAoB;IACtC,kBAAkB,EAAE,uBAAuB;IAC3C,gBAAgB,EAAE,mBAAmB;
|
|
1
|
+
{"version":3,"file":"TestIdConstants.js","sourceRoot":"","sources":["../../../Core/Components/TestIdConstants.js"],"names":[],"mappings":"AAAA,eAAe;IACb,YAAY,EAAE,sBAAsB;IACpC,WAAW,EAAE,qBAAqB;IAClC,UAAU,EAAE,oBAAoB;IAChC,iBAAiB,EAAE,4BAA4B;IAC/C,SAAS,EAAE,mBAAmB;IAC9B,qBAAqB,EAAE,yBAAyB;IAChD,gBAAgB,EAAE,oBAAoB;IACtC,WAAW,EAAE,cAAc;IAC3B,gBAAgB,EAAE,oBAAoB;IACtC,kBAAkB,EAAE,uBAAuB;IAC3C,gBAAgB,EAAE,mBAAmB;IACrC,WAAW,EAAE,qBAAqB;CACnC,CAAC","sourcesContent":["export default {\n filterButton: 'repeat-filter-button',\n groupButton: 'repeat-group-button',\n sortButton: 'repeat-sort-button',\n moreOptionsButton: 'repeat-more-options-button',\n noRecords: 'repeat-no-records',\n aggregateDisplayValue: 'aggregate-display-value',\n columnFilterIcon: 'column-filter-icon',\n groupHeader: 'group-header',\n groupHeaderCount: 'group-header-count',\n groupHeaderGroupBy: 'group-header-group-by',\n hierarchicalCell: 'hierarchical-cell',\n contextMenu: 'repeat-context-menu'\n};\n"]}
|
|
@@ -8,7 +8,7 @@ import useTranslate from '../../Hooks/useTranslate';
|
|
|
8
8
|
import { StyledSkeletonRow } from '../../Views/Table/SkeletonRows';
|
|
9
9
|
import getPaginationInfo from './Pagination';
|
|
10
10
|
import useScroll from './UseScroll';
|
|
11
|
-
import { getCurrentEstimation, updateRowContainerTop, setAttributesOnItems, isViewNotFilled, getRecordCountForLayoutPaint, getValueWithUnit, getMaxHeight } from './utility';
|
|
11
|
+
import { getCurrentEstimation, updateRowContainerTop, setAttributesOnItems, isViewNotFilled, getRecordCountForLayoutPaint, getValueWithUnit, getMaxHeight, getPContainerClientWidth } from './utility';
|
|
12
12
|
import useResizeObserver from './UseResizeObserver';
|
|
13
13
|
function getBContainerMinHeight(props) {
|
|
14
14
|
return props.$style.renderFooter ? `calc(100% - ${2 * props.$style.itemHeight + 1}px) ` : '0';
|
|
@@ -214,6 +214,12 @@ const Virtualize = forwardRef(({ id, viewHeight, viewWidth, totalRecordCount, it
|
|
|
214
214
|
getRowContainer,
|
|
215
215
|
getBContainer
|
|
216
216
|
]);
|
|
217
|
+
// Added this block to overcome clipping issue for group header.
|
|
218
|
+
const onPContainerDimensionUpdate = useCallback(() => {
|
|
219
|
+
getPContainer()?.style.setProperty('--container-width', `${getPContainerClientWidth(getPContainer())}px`);
|
|
220
|
+
}, [getPContainer]);
|
|
221
|
+
// observe on pContainer to adjust the width of row container.
|
|
222
|
+
useResizeObserver(getPContainer, onPContainerDimensionUpdate);
|
|
217
223
|
// On mount that means state is not initialized yet, trigger pagination.
|
|
218
224
|
// or whenever count changes or width /height of view port changes, if view is not filled with data, get indexes again.
|
|
219
225
|
useEffect(() => {
|