@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.
Files changed (37) hide show
  1. package/lib/Core/Components/ContextMenu/ContextMenuContainer.d.ts +6 -15
  2. package/lib/Core/Components/ContextMenu/ContextMenuContainer.d.ts.map +1 -1
  3. package/lib/Core/Components/ContextMenu/ContextMenuContainer.js +91 -165
  4. package/lib/Core/Components/ContextMenu/ContextMenuContainer.js.map +1 -1
  5. package/lib/Core/Components/GroupRenderer/GroupAdditionalFieldDataModal.d.ts +12 -0
  6. package/lib/Core/Components/GroupRenderer/GroupAdditionalFieldDataModal.d.ts.map +1 -0
  7. package/lib/Core/Components/GroupRenderer/GroupAdditionalFieldDataModal.js +62 -0
  8. package/lib/Core/Components/GroupRenderer/GroupAdditionalFieldDataModal.js.map +1 -0
  9. package/lib/Core/Components/GroupRenderer/GroupAdditionalInfo.d.ts +33 -0
  10. package/lib/Core/Components/GroupRenderer/GroupAdditionalInfo.d.ts.map +1 -0
  11. package/lib/Core/Components/GroupRenderer/GroupAdditionalInfo.js +110 -0
  12. package/lib/Core/Components/GroupRenderer/GroupAdditionalInfo.js.map +1 -0
  13. package/lib/Core/Components/GroupRenderer/index.d.ts +22 -0
  14. package/lib/Core/Components/GroupRenderer/index.d.ts.map +1 -0
  15. package/lib/Core/Components/{GroupRenderer.js → GroupRenderer/index.js} +85 -125
  16. package/lib/Core/Components/GroupRenderer/index.js.map +1 -0
  17. package/lib/Core/Components/TestIdConstants.d.ts +1 -0
  18. package/lib/Core/Components/TestIdConstants.js +2 -1
  19. package/lib/Core/Components/TestIdConstants.js.map +1 -1
  20. package/lib/Core/Components/Virtualise/index.js +7 -1
  21. package/lib/Core/Components/Virtualise/index.js.map +1 -1
  22. package/lib/Core/Context/LocalizationContext.d.ts +1 -1
  23. package/lib/Core/Context/LocalizationContext.d.ts.map +1 -1
  24. package/lib/Core/Context/LocalizationContext.js.map +1 -1
  25. package/lib/Core/Views/Table/StyledTableContainer.d.ts.map +1 -1
  26. package/lib/Core/Views/Table/StyledTableContainer.js +0 -10
  27. package/lib/Core/Views/Table/StyledTableContainer.js.map +1 -1
  28. package/lib/Core/Views/Table/TableA11y.d.ts.map +1 -1
  29. package/lib/Core/Views/Table/TableA11y.js +3 -2
  30. package/lib/Core/Views/Table/TableA11y.js.map +1 -1
  31. package/lib/types.d.ts +2 -0
  32. package/lib/types.d.ts.map +1 -1
  33. package/lib/types.js.map +1 -1
  34. package/package.json +7 -7
  35. package/lib/Core/Components/GroupRenderer.d.ts +0 -31
  36. package/lib/Core/Components/GroupRenderer.d.ts.map +0 -1
  37. package/lib/Core/Components/GroupRenderer.js.map +0 -1
@@ -1,17 +1,8 @@
1
- declare function ContextMenuContainer({ view, selector }: {
2
- view: any;
3
- selector: any;
1
+ import type { RsCoreTypes } from 'pega-repeating-structures-core';
2
+ export default function ContextMenuContainer({ view, selector }: {
3
+ view: RsCoreTypes.View;
4
+ selector: {
5
+ query: string;
6
+ };
4
7
  }): import("react/jsx-runtime").JSX.Element | null;
5
- declare namespace ContextMenuContainer {
6
- namespace propTypes {
7
- let view: PropTypes.Validator<{
8
- [x: string]: any;
9
- }>;
10
- let selector: PropTypes.Validator<{
11
- [x: string]: any;
12
- }>;
13
- }
14
- }
15
- export default ContextMenuContainer;
16
- import PropTypes from 'prop-types';
17
8
  //# sourceMappingURL=ContextMenuContainer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ContextMenuContainer.d.ts","sourceRoot":"","sources":["../../../../Core/Components/ContextMenu/ContextMenuContainer.jsx"],"names":[],"mappings":"AA4MA;;;mDA+GC;;;;;;;;;;;;sBA3TqB,YAAY"}
1
+ {"version":3,"file":"ContextMenuContainer.d.ts","sourceRoot":"","sources":["../../../../Core/Components/ContextMenu/ContextMenuContainer.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AA0FlE,MAAM,CAAC,OAAO,UAAU,oBAAoB,CAAC,EAC3C,IAAI,EACJ,QAAQ,EACT,EAAE;IACD,IAAI,EAAE,WAAW,CAAC,IAAI,CAAC;IACvB,QAAQ,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;CAC7B,kDAyGA"}
@@ -1,136 +1,55 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import PropTypes from 'prop-types';
3
- import { useRef, useState, useMemo, useEffect, useCallback } from 'react';
4
- import styled, { css } from 'styled-components';
5
- import { mix } from 'polished';
6
- import { Popover, Icon, useElement, useOuterEvent, tryCatch } from '@pega/cosmos-react-core';
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { useState, useMemo, useEffect, useCallback } from 'react';
3
+ import { v4 as uuidV4 } from 'uuid';
4
+ import { Popover, Icon, useElement, useOuterEvent, Menu, isInstance } from '@pega/cosmos-react-core';
7
5
  import { getRowContextData, getScrollerElem, isFilterApplied } from 'pega-repeating-structures-core';
8
- import { createClassName as cx } from '../../Utils';
9
6
  import useTranslate from '../../Hooks/useTranslate';
10
7
  import useScrollAway from '../../Hooks/useScrollAway';
8
+ import TestIdConstants from '../TestIdConstants';
11
9
  import { applyFilter, quickFilterEnabled, removeFilter } from './QuickFilter';
12
10
  import copyText from './CopyPaste';
13
- const StyledPopover = styled.div `
14
- width: 10rem;
15
- `;
16
- const StyledContent = styled.div(({ theme }) => {
17
- const hoverColor = tryCatch(() => mix(0.95, theme.base.palette['primary-background'], theme.base.palette.interactive));
18
- return css `
19
- white-space: nowrap;
20
- overflow: hidden;
21
- text-overflow: ellipsis;
22
- padding: 0.25rem;
23
- border-radius: 0.156rem;
24
- box-sizing: border-box;
25
- cursor: pointer;
26
- margin-top: 0.125rem;
27
- margin-bottom: 0.125rem;
28
- :hover {
29
- background-color: ${hoverColor};
30
- box-shadow: ${theme.base.shadow['focus-inset']};
31
- }
32
- `;
33
- });
34
- const StyledListItem = styled.div(({ theme }) => {
35
- return css `
36
- button {
37
- display: flex;
38
- align-items: center;
39
- /* stylelint-disable unit-allowed-list */
40
- padding: 4px 8px;
41
- }
42
- .label {
43
- padding-left: 14px;
44
- vertical-align: text-top;
45
- }
46
- .disabled {
47
- padding-left: 14px;
48
- vertical-align: text-top;
49
- opacity: ${theme.base['disabled-opacity']};
50
- }
51
- `;
52
- });
53
- const StyledButton = styled.button `
54
- display: block;
55
- text-align: start;
56
- background: none;
57
- border: none;
58
- line-height: 1;
59
- outline: none;
60
- cursor: pointer;
61
- color: ${props => props.theme.base.palette['foreground-color']};
62
- border-radius: 0;
63
- `;
64
- const getDefaultMenuItems = (column, rowContextData, targetCell, columns, filterExpression, actionColumnFiltering, actionClearFiltering, translate) => {
65
- const isFiltered = isFilterApplied(column, filterExpression);
66
- return [
67
- {
11
+ const getMenuItems = (targetCell, column, rowContextData, view, translate) => {
12
+ const { columns = [], state: { filterExpression } = {}, type: { applyFilter: applyViewFilter, clearFilter } } = view;
13
+ const defaultMenuItems = [];
14
+ if (quickFilterEnabled(columns, column.field.id)) {
15
+ const isFiltered = filterExpression && isFilterApplied(column, filterExpression);
16
+ defaultMenuItems.push({
68
17
  id: 'quickFilter',
69
- icon: isFiltered ? 'times' : 'filter',
70
- label: isFiltered ? translate('Remove filter') : translate('Filter by this'),
71
- show: !!quickFilterEnabled(columns, column.field.id),
72
- disabled: false,
18
+ visual: isFiltered ? _jsx(Icon, { name: 'times' }) : _jsx(Icon, { name: 'filter' }),
19
+ primary: isFiltered ? translate('Remove filter') : translate('Filter by this'),
73
20
  onClick: () => {
74
21
  if (isFiltered) {
75
- return removeFilter(filterExpression, targetCell, actionColumnFiltering, actionClearFiltering);
22
+ removeFilter(filterExpression, targetCell, applyViewFilter, clearFilter);
23
+ }
24
+ else {
25
+ applyFilter(columns, targetCell, rowContextData, filterExpression, applyViewFilter);
76
26
  }
77
- return applyFilter(columns, targetCell, rowContextData, filterExpression, actionColumnFiltering);
78
27
  }
79
- },
80
- {
81
- id: 'copyText',
82
- icon: 'copy',
83
- label: translate('Copy text'),
84
- show: true,
85
- disabled: false,
86
- onClick: () => copyText(targetCell)
87
- },
88
- {
89
- id: 'pasteText',
90
- icon: 'documents',
91
- label: translate('Paste text'),
92
- show: true,
93
- disabled: true,
94
- onClick: () => { }
95
- }
96
- ];
97
- };
98
- const getMenuItems = (targetCell, column, rowContextData, columns, filterExpression, actionColumnFiltering, actionClearFiltering, translate) => {
99
- const fieldContextOptions = column.field?.contextMenuOptions || [];
100
- return [
101
- ...getDefaultMenuItems(column, rowContextData, targetCell, columns, filterExpression, actionColumnFiltering, actionClearFiltering, translate),
102
- ...fieldContextOptions
103
- ];
104
- };
105
- const shouldOverrideContextMenu = (targetCell, columns) => {
106
- if (!targetCell) {
107
- return false;
28
+ });
108
29
  }
30
+ defaultMenuItems.push({
31
+ id: 'copyText',
32
+ visual: _jsx(Icon, { name: 'copy' }),
33
+ primary: translate('Copy text'),
34
+ onClick: () => copyText(targetCell)
35
+ });
36
+ const fieldSpecificMenuItems = (column.field?.contextMenuOptions || []).map(option => ({
37
+ id: option.id,
38
+ visual: option.icon ? _jsx(Icon, { name: option.icon }) : undefined,
39
+ primary: option.label || '',
40
+ onClick: () => option.onClick?.(targetCell)
41
+ }));
42
+ return [...defaultMenuItems, ...fieldSpecificMenuItems];
43
+ };
44
+ const shouldOverrideContextMenu = (targetCell, columns = []) => {
109
45
  const { colId } = targetCell.dataset;
110
46
  const { field } = columns.find(col => col.field.id.toString() === colId?.toString()) || {};
111
47
  return !(!field || field?.noContextMenu);
112
48
  };
113
- const MenuItem = ({ menu = {}, target = {}, column = {}, rowContextData = {}, onMenuItemClick = () => { } }) => {
114
- const { onClick = () => { }, icon, disabled = false, show = true, label } = menu;
115
- if (!show) {
116
- return null;
117
- }
118
- return (_jsx(StyledContent, { onClick: () => {
119
- onMenuItemClick();
120
- onClick(target, column, rowContextData);
121
- }, children: _jsx(StyledListItem, { children: _jsxs(StyledButton, { children: [icon && _jsx(Icon, { name: icon }), _jsx("span", { className: cx('label', { disabled }), children: label })] }) }) }));
122
- };
123
- MenuItem.propTypes = {
124
- menu: PropTypes.objectOf(PropTypes.any),
125
- target: PropTypes.objectOf(PropTypes.any),
126
- column: PropTypes.objectOf(PropTypes.any),
127
- rowContextData: PropTypes.objectOf(PropTypes.any),
128
- onMenuItemClick: PropTypes.func
129
- };
130
49
  export default function ContextMenuContainer({ view, selector }) {
131
- const { columns, data, state: { paginationOptions, filterExpression } = {}, domContainer, type: { applyFilter: applyViewFilter, clearFilter } } = view;
50
+ const { columns = [], data = [], state: { paginationOptions } = {}, domContainer } = view;
132
51
  const [translate] = useTranslate();
133
- const contextMenuRef = useRef({}).current;
52
+ const [menuContext, setMenuContext] = useState(null);
134
53
  const [showMenu, setShowMenu] = useState(false);
135
54
  const [menuItems, setMenuItems] = useState([]);
136
55
  const [popperRef, setPopperRef] = useElement();
@@ -141,63 +60,70 @@ export default function ContextMenuContainer({ view, selector }) {
141
60
  useScrollAway(popperRef, scrollerElem, () => {
142
61
  setShowMenu(false);
143
62
  });
144
- const onMenuItemClick = useCallback(event => {
145
- if (event && event.key !== 'Escape') {
146
- return;
63
+ useEffect(() => {
64
+ if (!showMenu) {
65
+ const targetCell = menuContext?.targetCell;
66
+ if (targetCell) {
67
+ targetCell.removeAttribute('data-context-menu-active');
68
+ targetCell.removeAttribute('aria-expanded');
69
+ targetCell.removeAttribute('aria-controls');
70
+ }
71
+ setMenuContext(null);
147
72
  }
148
- setShowMenu(false);
149
- }, []);
150
- const contextMenuListener = useCallback(e => {
151
- const targetElement = selector ? e.target.closest(selector.query.toString()) : e.target;
152
- if (shouldOverrideContextMenu(targetElement, columns) &&
153
- // TODO: We will add "Open link in new tab" option in context menu once the custom context menu is made accessible.
154
- !e.target.closest('a')) {
73
+ }, [showMenu]);
74
+ const contextMenuListener = useCallback((e) => {
75
+ const target = e.target;
76
+ if (!isInstance(target, Element))
77
+ return;
78
+ const targetElement = target.closest(selector.query.toString());
79
+ if (!isInstance(targetElement, HTMLElement))
80
+ return;
81
+ if (shouldOverrideContextMenu(targetElement, columns) && !target.closest('a')) {
155
82
  e.stopPropagation();
156
83
  e.preventDefault();
157
- contextMenuRef.targetCell = targetElement;
158
- const { colId } = contextMenuRef.targetCell.dataset;
159
- contextMenuRef.column = columns.find(col => col.field.id.toString() === colId?.toString());
160
- contextMenuRef.rowContextData = getRowContextData(data, paginationOptions, targetElement);
161
- targetElement.classList.add('selection-border', 'disable-select');
162
- const options = getMenuItems(targetElement, contextMenuRef.column, contextMenuRef.rowContextData, columns, filterExpression, applyViewFilter, clearFilter, translate);
84
+ const { colId } = targetElement.dataset;
85
+ const column = columns.find(col => col.field.id.toString() === colId?.toString());
86
+ if (!column)
87
+ return;
88
+ targetElement.setAttribute('data-context-menu-active', 'true');
89
+ targetElement.setAttribute('aria-expanded', 'true');
90
+ const menuId = `rs-context-menu-${uuidV4()}`;
91
+ targetElement.setAttribute('aria-controls', menuId);
92
+ const rowContextData = getRowContextData(data, paginationOptions || {}, targetElement);
93
+ const options = getMenuItems(targetElement, column, rowContextData, view, translate);
94
+ if (!options.length)
95
+ return;
163
96
  setShowMenu(true);
164
97
  setMenuItems(options);
98
+ setMenuContext({
99
+ column,
100
+ targetCell: targetElement,
101
+ rowContextData,
102
+ menuId
103
+ });
165
104
  }
166
- }, [
167
- selector,
168
- columns,
169
- contextMenuRef.targetCell,
170
- contextMenuRef.column,
171
- contextMenuRef.rowContextData,
172
- data,
173
- paginationOptions,
174
- filterExpression,
175
- applyViewFilter,
176
- clearFilter,
177
- translate
178
- ]);
105
+ }, [selector, columns, data, paginationOptions, translate, view]);
106
+ const onKeydown = useCallback(({ key }) => {
107
+ if (key === 'Escape')
108
+ setShowMenu(false);
109
+ }, []);
179
110
  useEffect(() => {
180
- if (domContainer) {
181
- domContainer.addEventListener('contextmenu', contextMenuListener);
182
- domContainer.addEventListener('keydown', onMenuItemClick);
183
- }
111
+ const abortController = new AbortController();
112
+ if (!domContainer)
113
+ return;
114
+ domContainer.addEventListener('contextmenu', contextMenuListener, {
115
+ signal: abortController.signal
116
+ });
117
+ document.addEventListener('keydown', onKeydown, {
118
+ signal: abortController.signal
119
+ });
184
120
  return () => {
185
- if (domContainer) {
186
- domContainer.removeEventListener('contextmenu', contextMenuListener);
187
- domContainer.removeEventListener('keydown', onMenuItemClick);
188
- }
121
+ abortController.abort();
189
122
  };
190
- }, [domContainer, contextMenuListener, onMenuItemClick]);
191
- if (!contextMenuRef.targetCell || !showMenu || !domContainer) {
192
- if (contextMenuRef.targetCell && selector) {
193
- contextMenuRef.targetCell.classList.remove('selection-border', 'disable-select');
194
- }
195
- return null;
196
- }
197
- return (_jsx(Popover, { portal: true, ref: setPopperRef, target: contextMenuRef.targetCell, children: _jsx(StyledPopover, { children: menuItems.map(menu => (_jsx(MenuItem, { onMenuItemClick: onMenuItemClick, target: contextMenuRef.targetCell, column: contextMenuRef.column, rowContextData: contextMenuRef.rowContextData, menu: menu }, menu.id))) }) }));
123
+ }, [domContainer, contextMenuListener]);
124
+ return showMenu && menuContext ? (_jsx(Popover, { ref: setPopperRef, target: menuContext.targetCell, children: _jsx(Menu, { id: menuContext.menuId, items: menuItems, onItemClick: (_, e) => {
125
+ e.preventDefault();
126
+ setShowMenu(false);
127
+ }, focusControlEl: menuContext.targetCell, className: 'action-menu', "data-testid": TestIdConstants.contextMenu, "data-test-id": 'action-menu' }) })) : null;
198
128
  }
199
- ContextMenuContainer.propTypes = {
200
- view: PropTypes.objectOf(PropTypes.any).isRequired,
201
- selector: PropTypes.objectOf(PropTypes.any).isRequired
202
- };
203
129
  //# sourceMappingURL=ContextMenuContainer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ContextMenuContainer.js","sourceRoot":"","sources":["../../../../Core/Components/ContextMenu/ContextMenuContainer.jsx"],"names":[],"mappings":"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","sourcesContent":["import PropTypes from 'prop-types';\nimport { useRef, useState, useMemo, useEffect, useCallback } from 'react';\nimport styled, { css } from 'styled-components';\nimport { mix } from 'polished';\n\nimport { Popover, Icon, useElement, useOuterEvent, tryCatch } from '@pega/cosmos-react-core';\nimport {\n getRowContextData,\n getScrollerElem,\n isFilterApplied\n} from 'pega-repeating-structures-core';\n\nimport { createClassName as cx } from '../../Utils';\nimport useTranslate from '../../Hooks/useTranslate';\nimport useScrollAway from '../../Hooks/useScrollAway';\n\nimport { applyFilter, quickFilterEnabled, removeFilter } from './QuickFilter';\nimport copyText from './CopyPaste';\n\nconst StyledPopover = styled.div`\n width: 10rem;\n`;\n\nconst StyledContent = styled.div(({ theme }) => {\n const hoverColor = tryCatch(() =>\n mix(0.95, theme.base.palette['primary-background'], theme.base.palette.interactive)\n );\n return css`\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n padding: 0.25rem;\n border-radius: 0.156rem;\n box-sizing: border-box;\n cursor: pointer;\n margin-top: 0.125rem;\n margin-bottom: 0.125rem;\n :hover {\n background-color: ${hoverColor};\n box-shadow: ${theme.base.shadow['focus-inset']};\n }\n `;\n});\n\nconst StyledListItem = styled.div(({ theme }) => {\n return css`\n button {\n display: flex;\n align-items: center;\n /* stylelint-disable unit-allowed-list */\n padding: 4px 8px;\n }\n .label {\n padding-left: 14px;\n vertical-align: text-top;\n }\n .disabled {\n padding-left: 14px;\n vertical-align: text-top;\n opacity: ${theme.base['disabled-opacity']};\n }\n `;\n});\n\nconst StyledButton = styled.button`\n display: block;\n text-align: start;\n background: none;\n border: none;\n line-height: 1;\n outline: none;\n cursor: pointer;\n color: ${props => props.theme.base.palette['foreground-color']};\n border-radius: 0;\n`;\n\nconst getDefaultMenuItems = (\n column,\n rowContextData,\n targetCell,\n columns,\n filterExpression,\n actionColumnFiltering,\n actionClearFiltering,\n translate\n) => {\n const isFiltered = isFilterApplied(column, filterExpression);\n return [\n {\n id: 'quickFilter',\n icon: isFiltered ? 'times' : 'filter',\n label: isFiltered ? translate('Remove filter') : translate('Filter by this'),\n show: !!quickFilterEnabled(columns, column.field.id),\n disabled: false,\n onClick: () => {\n if (isFiltered) {\n return removeFilter(\n filterExpression,\n targetCell,\n actionColumnFiltering,\n actionClearFiltering\n );\n }\n return applyFilter(\n columns,\n targetCell,\n rowContextData,\n filterExpression,\n actionColumnFiltering\n );\n }\n },\n {\n id: 'copyText',\n icon: 'copy',\n label: translate('Copy text'),\n show: true,\n disabled: false,\n onClick: () => copyText(targetCell)\n },\n {\n id: 'pasteText',\n icon: 'documents',\n label: translate('Paste text'),\n show: true,\n disabled: true,\n onClick: () => {}\n }\n ];\n};\n\nconst getMenuItems = (\n targetCell,\n column,\n rowContextData,\n columns,\n filterExpression,\n actionColumnFiltering,\n actionClearFiltering,\n translate\n) => {\n const fieldContextOptions = column.field?.contextMenuOptions || [];\n return [\n ...getDefaultMenuItems(\n column,\n rowContextData,\n targetCell,\n columns,\n filterExpression,\n actionColumnFiltering,\n actionClearFiltering,\n translate\n ),\n ...fieldContextOptions\n ];\n};\n\nconst shouldOverrideContextMenu = (targetCell, columns) => {\n if (!targetCell) {\n return false;\n }\n const { colId } = targetCell.dataset;\n\n const { field } = columns.find(col => col.field.id.toString() === colId?.toString()) || {};\n return !(!field || field?.noContextMenu);\n};\n\nconst MenuItem = ({\n menu = {},\n target = {},\n column = {},\n rowContextData = {},\n onMenuItemClick = () => {}\n}) => {\n const { onClick = () => {}, icon, disabled = false, show = true, label } = menu;\n if (!show) {\n return null;\n }\n\n return (\n <StyledContent\n onClick={() => {\n onMenuItemClick();\n onClick(target, column, rowContextData);\n }}\n >\n <StyledListItem>\n <StyledButton>\n {icon && <Icon name={icon} />}\n <span className={cx('label', { disabled })}>{label}</span>\n </StyledButton>\n </StyledListItem>\n </StyledContent>\n );\n};\n\nMenuItem.propTypes = {\n menu: PropTypes.objectOf(PropTypes.any),\n target: PropTypes.objectOf(PropTypes.any),\n column: PropTypes.objectOf(PropTypes.any),\n rowContextData: PropTypes.objectOf(PropTypes.any),\n onMenuItemClick: PropTypes.func\n};\n\nexport default function ContextMenuContainer({ view, selector }) {\n const {\n columns,\n data,\n state: { paginationOptions, filterExpression } = {},\n domContainer,\n type: { applyFilter: applyViewFilter, clearFilter }\n } = view;\n const [translate] = useTranslate();\n const contextMenuRef = useRef({}).current;\n const [showMenu, setShowMenu] = useState(false);\n const [menuItems, setMenuItems] = useState([]);\n const [popperRef, setPopperRef] = useElement();\n const scrollerElem = useMemo(() => getScrollerElem(view), [view]);\n\n useOuterEvent('mousedown', [popperRef], () => {\n setShowMenu(false);\n });\n\n useScrollAway(popperRef, scrollerElem, () => {\n setShowMenu(false);\n });\n\n const onMenuItemClick = useCallback(event => {\n if (event && event.key !== 'Escape') {\n return;\n }\n setShowMenu(false);\n }, []);\n\n const contextMenuListener = useCallback(\n e => {\n const targetElement = selector ? e.target.closest(selector.query.toString()) : e.target;\n if (\n shouldOverrideContextMenu(targetElement, columns) &&\n // TODO: We will add \"Open link in new tab\" option in context menu once the custom context menu is made accessible.\n !e.target.closest('a')\n ) {\n e.stopPropagation();\n e.preventDefault();\n contextMenuRef.targetCell = targetElement;\n const { colId } = contextMenuRef.targetCell.dataset;\n contextMenuRef.column = columns.find(col => col.field.id.toString() === colId?.toString());\n contextMenuRef.rowContextData = getRowContextData(data, paginationOptions, targetElement);\n targetElement.classList.add('selection-border', 'disable-select');\n const options = getMenuItems(\n targetElement,\n contextMenuRef.column,\n contextMenuRef.rowContextData,\n columns,\n filterExpression,\n applyViewFilter,\n clearFilter,\n translate\n );\n setShowMenu(true);\n setMenuItems(options);\n }\n },\n\n [\n selector,\n columns,\n contextMenuRef.targetCell,\n contextMenuRef.column,\n contextMenuRef.rowContextData,\n data,\n paginationOptions,\n filterExpression,\n applyViewFilter,\n clearFilter,\n translate\n ]\n );\n\n useEffect(() => {\n if (domContainer) {\n domContainer.addEventListener('contextmenu', contextMenuListener);\n domContainer.addEventListener('keydown', onMenuItemClick);\n }\n return () => {\n if (domContainer) {\n domContainer.removeEventListener('contextmenu', contextMenuListener);\n domContainer.removeEventListener('keydown', onMenuItemClick);\n }\n };\n }, [domContainer, contextMenuListener, onMenuItemClick]);\n\n if (!contextMenuRef.targetCell || !showMenu || !domContainer) {\n if (contextMenuRef.targetCell && selector) {\n contextMenuRef.targetCell.classList.remove('selection-border', 'disable-select');\n }\n return null;\n }\n\n return (\n <Popover portal ref={setPopperRef} target={contextMenuRef.targetCell}>\n <StyledPopover>\n {menuItems.map(menu => (\n <MenuItem\n key={menu.id}\n onMenuItemClick={onMenuItemClick}\n target={contextMenuRef.targetCell}\n column={contextMenuRef.column}\n rowContextData={contextMenuRef.rowContextData}\n menu={menu}\n />\n ))}\n </StyledPopover>\n </Popover>\n );\n}\n\nContextMenuContainer.propTypes = {\n view: PropTypes.objectOf(PropTypes.any).isRequired,\n selector: PropTypes.objectOf(PropTypes.any).isRequired\n};\n"]}
1
+ {"version":3,"file":"ContextMenuContainer.js","sourceRoot":"","sources":["../../../../Core/Components/ContextMenu/ContextMenuContainer.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAClE,OAAO,EAAE,EAAE,IAAI,MAAM,EAAE,MAAM,MAAM,CAAC;AAIpC,OAAO,EACL,OAAO,EACP,IAAI,EACJ,UAAU,EACV,aAAa,EACb,IAAI,EACJ,UAAU,EACX,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,eAAe,EAChB,MAAM,gCAAgC,CAAC;AAExC,OAAO,YAAY,MAAM,0BAA0B,CAAC;AACpD,OAAO,aAAa,MAAM,2BAA2B,CAAC;AACtD,OAAO,eAAe,MAAM,oBAAoB,CAAC;AAEjD,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC9E,OAAO,QAAQ,MAAM,aAAa,CAAC;AASnC,MAAM,YAAY,GAAG,CACnB,UAAuB,EACvB,MAA0B,EAC1B,cAAmC,EACnC,IAAsB,EACtB,SAAkC,EACjB,EAAE;IACnB,MAAM,EACJ,OAAO,GAAG,EAAE,EACZ,KAAK,EAAE,EAAE,gBAAgB,EAAE,GAAG,EAAE,EAChC,IAAI,EAAE,EAAE,WAAW,EAAE,eAAe,EAAE,WAAW,EAAE,EACpD,GAAG,IAAI,CAAC;IACT,MAAM,gBAAgB,GAAoB,EAAE,CAAC;IAE7C,IAAI,kBAAkB,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;QACjD,MAAM,UAAU,GAAG,gBAAgB,IAAI,eAAe,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;QACjF,gBAAgB,CAAC,IAAI,CAAC;YACpB,EAAE,EAAE,aAAa;YACjB,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,KAAC,IAAI,IAAC,IAAI,EAAC,OAAO,GAAG,CAAC,CAAC,CAAC,KAAC,IAAI,IAAC,IAAI,EAAC,QAAQ,GAAG;YACnE,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC;YAE9E,OAAO,EAAE,GAAG,EAAE;gBACZ,IAAI,UAAU,EAAE,CAAC;oBACf,YAAY,CAAC,gBAAgB,EAAE,UAAU,EAAE,eAAe,EAAE,WAAW,CAAC,CAAC;gBAC3E,CAAC;qBAAM,CAAC;oBACN,WAAW,CAAC,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,gBAAgB,EAAE,eAAe,CAAC,CAAC;gBACtF,CAAC;YACH,CAAC;SACF,CAAC,CAAC;IACL,CAAC;IAED,gBAAgB,CAAC,IAAI,CAAC;QACpB,EAAE,EAAE,UAAU;QACd,MAAM,EAAE,KAAC,IAAI,IAAC,IAAI,EAAC,MAAM,GAAG;QAC5B,OAAO,EAAE,SAAS,CAAC,WAAW,CAAC;QAC/B,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC;KACpC,CAAC,CAAC;IAEH,MAAM,sBAAsB,GAAoB,CAAC,MAAM,CAAC,KAAK,EAAE,kBAAkB,IAAI,EAAE,CAAC,CAAC,GAAG,CAC1F,MAAM,CAAC,EAAE,CAAC,CAAC;QACT,EAAE,EAAE,MAAM,CAAC,EAAE;QACb,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,KAAC,IAAI,IAAC,IAAI,EAAE,MAAM,CAAC,IAAI,GAAI,CAAC,CAAC,CAAC,SAAS;QAC7D,OAAO,EAAE,MAAM,CAAC,KAAK,IAAI,EAAE;QAC3B,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,UAAU,CAAC;KAC5C,CAAC,CACH,CAAC;IAEF,OAAO,CAAC,GAAG,gBAAgB,EAAE,GAAG,sBAAsB,CAAC,CAAC;AAC1D,CAAC,CAAC;AAEF,MAAM,yBAAyB,GAAG,CAChC,UAAuB,EACvB,UAAgC,EAAE,EACzB,EAAE;IACX,MAAM,EAAE,KAAK,EAAE,GAAG,UAAU,CAAC,OAAO,CAAC;IAErC,MAAM,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,KAAK,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC;IAC3F,OAAO,CAAC,CAAC,CAAC,KAAK,IAAI,KAAK,EAAE,aAAa,CAAC,CAAC;AAC3C,CAAC,CAAC;AAEF,MAAM,CAAC,OAAO,UAAU,oBAAoB,CAAC,EAC3C,IAAI,EACJ,QAAQ,EAIT;IACC,MAAM,EAAE,OAAO,GAAG,EAAE,EAAE,IAAI,GAAG,EAAE,EAAE,KAAK,EAAE,EAAE,iBAAiB,EAAE,GAAG,EAAE,EAAE,YAAY,EAAE,GAAG,IAAI,CAAC;IAE1F,MAAM,CAAC,SAAS,CAAC,GAAG,YAAY,EAAE,CAAC;IACnC,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAc,IAAI,CAAC,CAAC;IAClE,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAChD,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAkB,EAAE,CAAC,CAAC;IAChE,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,UAAU,EAAE,CAAC;IAC/C,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IAElE,aAAa,CAAC,WAAW,EAAE,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE;QAC3C,WAAW,CAAC,KAAK,CAAC,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,aAAa,CAAC,SAAS,EAAE,YAAY,EAAE,GAAG,EAAE;QAC1C,WAAW,CAAC,KAAK,CAAC,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,UAAU,GAAG,WAAW,EAAE,UAAU,CAAC;YAC3C,IAAI,UAAU,EAAE,CAAC;gBACf,UAAU,CAAC,eAAe,CAAC,0BAA0B,CAAC,CAAC;gBACvD,UAAU,CAAC,eAAe,CAAC,eAAe,CAAC,CAAC;gBAC5C,UAAU,CAAC,eAAe,CAAC,eAAe,CAAC,CAAC;YAC9C,CAAC;YACD,cAAc,CAAC,IAAI,CAAC,CAAC;QACvB,CAAC;IACH,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEf,MAAM,mBAAmB,GAAG,WAAW,CACrC,CAAC,CAAa,EAAE,EAAE;QAChB,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;QACxB,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC;YAAE,OAAO;QAEzC,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;QAChE,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,WAAW,CAAC;YAAE,OAAO;QAEpD,IAAI,yBAAyB,CAAC,aAAa,EAAE,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YAC9E,CAAC,CAAC,eAAe,EAAE,CAAC;YACpB,CAAC,CAAC,cAAc,EAAE,CAAC;YAEnB,MAAM,EAAE,KAAK,EAAE,GAAG,aAAa,CAAC,OAAO,CAAC;YACxC,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;YAClF,IAAI,CAAC,MAAM;gBAAE,OAAO;YAEpB,aAAa,CAAC,YAAY,CAAC,0BAA0B,EAAE,MAAM,CAAC,CAAC;YAC/D,aAAa,CAAC,YAAY,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;YACpD,MAAM,MAAM,GAAG,mBAAmB,MAAM,EAAE,EAAE,CAAC;YAC7C,aAAa,CAAC,YAAY,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;YAEpD,MAAM,cAAc,GAAG,iBAAiB,CAAC,IAAI,EAAE,iBAAiB,IAAI,EAAE,EAAE,aAAa,CAAC,CAAC;YACvF,MAAM,OAAO,GAAG,YAAY,CAAC,aAAa,EAAE,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;YACrF,IAAI,CAAC,OAAO,CAAC,MAAM;gBAAE,OAAO;YAE5B,WAAW,CAAC,IAAI,CAAC,CAAC;YAClB,YAAY,CAAC,OAAO,CAAC,CAAC;YACtB,cAAc,CAAC;gBACb,MAAM;gBACN,UAAU,EAAE,aAAa;gBACzB,cAAc;gBACd,MAAM;aACP,CAAC,CAAC;QACL,CAAC;IACH,CAAC,EACD,CAAC,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,iBAAiB,EAAE,SAAS,EAAE,IAAI,CAAC,CAC9D,CAAC;IAEF,MAAM,SAAS,GAAG,WAAW,CAAC,CAAC,EAAE,GAAG,EAAiB,EAAE,EAAE;QACvD,IAAI,GAAG,KAAK,QAAQ;YAAE,WAAW,CAAC,KAAK,CAAC,CAAC;IAC3C,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,eAAe,GAAG,IAAI,eAAe,EAAE,CAAC;QAC9C,IAAI,CAAC,YAAY;YAAE,OAAO;QAE1B,YAAY,CAAC,gBAAgB,CAAC,aAAa,EAAE,mBAAmB,EAAE;YAChE,MAAM,EAAE,eAAe,CAAC,MAAM;SAC/B,CAAC,CAAC;QACH,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,SAAS,EAAE;YAC9C,MAAM,EAAE,eAAe,CAAC,MAAM;SAC/B,CAAC,CAAC;QAEH,OAAO,GAAG,EAAE;YACV,eAAe,CAAC,KAAK,EAAE,CAAC;QAC1B,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,YAAY,EAAE,mBAAmB,CAAC,CAAC,CAAC;IAExC,OAAO,QAAQ,IAAI,WAAW,CAAC,CAAC,CAAC,CAC/B,KAAC,OAAO,IAAC,GAAG,EAAE,YAAY,EAAE,MAAM,EAAE,WAAW,CAAC,UAAU,YACxD,KAAC,IAAI,IACH,EAAE,EAAE,WAAW,CAAC,MAAM,EACtB,KAAK,EAAE,SAAS,EAChB,WAAW,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;gBACpB,CAAC,CAAC,cAAc,EAAE,CAAC;gBACnB,WAAW,CAAC,KAAK,CAAC,CAAC;YACrB,CAAC,EACD,cAAc,EAAE,WAAW,CAAC,UAAU,EACtC,SAAS,EAAC,aAAa,iBACV,eAAe,CAAC,WAAW,kBAE3B,aAAa,GAC1B,GACM,CACX,CAAC,CAAC,CAAC,IAAI,CAAC;AACX,CAAC","sourcesContent":["import { useState, useMemo, useEffect, useCallback } from 'react';\nimport { v4 as uuidV4 } from 'uuid';\n\nimport type { RsCoreTypes } from 'pega-repeating-structures-core';\nimport type { MenuItemProps } from '@pega/cosmos-react-core';\nimport {\n Popover,\n Icon,\n useElement,\n useOuterEvent,\n Menu,\n isInstance\n} from '@pega/cosmos-react-core';\nimport {\n getRowContextData,\n getScrollerElem,\n isFilterApplied\n} from 'pega-repeating-structures-core';\n\nimport useTranslate from '../../Hooks/useTranslate';\nimport useScrollAway from '../../Hooks/useScrollAway';\nimport TestIdConstants from '../TestIdConstants';\n\nimport { applyFilter, quickFilterEnabled, removeFilter } from './QuickFilter';\nimport copyText from './CopyPaste';\n\ntype MenuContext = {\n targetCell: HTMLElement;\n column: RsCoreTypes.Column;\n rowContextData: RsCoreTypes.RowData;\n menuId: string;\n} | null;\n\nconst getMenuItems = (\n targetCell: HTMLElement,\n column: RsCoreTypes.Column,\n rowContextData: RsCoreTypes.RowData,\n view: RsCoreTypes.View,\n translate: (key: string) => string\n): MenuItemProps[] => {\n const {\n columns = [],\n state: { filterExpression } = {},\n type: { applyFilter: applyViewFilter, clearFilter }\n } = view;\n const defaultMenuItems: MenuItemProps[] = [];\n\n if (quickFilterEnabled(columns, column.field.id)) {\n const isFiltered = filterExpression && isFilterApplied(column, filterExpression);\n defaultMenuItems.push({\n id: 'quickFilter',\n visual: isFiltered ? <Icon name='times' /> : <Icon name='filter' />,\n primary: isFiltered ? translate('Remove filter') : translate('Filter by this'),\n\n onClick: () => {\n if (isFiltered) {\n removeFilter(filterExpression, targetCell, applyViewFilter, clearFilter);\n } else {\n applyFilter(columns, targetCell, rowContextData, filterExpression, applyViewFilter);\n }\n }\n });\n }\n\n defaultMenuItems.push({\n id: 'copyText',\n visual: <Icon name='copy' />,\n primary: translate('Copy text'),\n onClick: () => copyText(targetCell)\n });\n\n const fieldSpecificMenuItems: MenuItemProps[] = (column.field?.contextMenuOptions || []).map(\n option => ({\n id: option.id,\n visual: option.icon ? <Icon name={option.icon} /> : undefined,\n primary: option.label || '',\n onClick: () => option.onClick?.(targetCell)\n })\n );\n\n return [...defaultMenuItems, ...fieldSpecificMenuItems];\n};\n\nconst shouldOverrideContextMenu = (\n targetCell: HTMLElement,\n columns: RsCoreTypes.Column[] = []\n): boolean => {\n const { colId } = targetCell.dataset;\n\n const { field } = columns.find(col => col.field.id.toString() === colId?.toString()) || {};\n return !(!field || field?.noContextMenu);\n};\n\nexport default function ContextMenuContainer({\n view,\n selector\n}: {\n view: RsCoreTypes.View;\n selector: { query: string };\n}) {\n const { columns = [], data = [], state: { paginationOptions } = {}, domContainer } = view;\n\n const [translate] = useTranslate();\n const [menuContext, setMenuContext] = useState<MenuContext>(null);\n const [showMenu, setShowMenu] = useState(false);\n const [menuItems, setMenuItems] = useState<MenuItemProps[]>([]);\n const [popperRef, setPopperRef] = useElement();\n const scrollerElem = useMemo(() => getScrollerElem(view), [view]);\n\n useOuterEvent('mousedown', [popperRef], () => {\n setShowMenu(false);\n });\n\n useScrollAway(popperRef, scrollerElem, () => {\n setShowMenu(false);\n });\n\n useEffect(() => {\n if (!showMenu) {\n const targetCell = menuContext?.targetCell;\n if (targetCell) {\n targetCell.removeAttribute('data-context-menu-active');\n targetCell.removeAttribute('aria-expanded');\n targetCell.removeAttribute('aria-controls');\n }\n setMenuContext(null);\n }\n }, [showMenu]);\n\n const contextMenuListener = useCallback(\n (e: MouseEvent) => {\n const target = e.target;\n if (!isInstance(target, Element)) return;\n\n const targetElement = target.closest(selector.query.toString());\n if (!isInstance(targetElement, HTMLElement)) return;\n\n if (shouldOverrideContextMenu(targetElement, columns) && !target.closest('a')) {\n e.stopPropagation();\n e.preventDefault();\n\n const { colId } = targetElement.dataset;\n const column = columns.find(col => col.field.id.toString() === colId?.toString());\n if (!column) return;\n\n targetElement.setAttribute('data-context-menu-active', 'true');\n targetElement.setAttribute('aria-expanded', 'true');\n const menuId = `rs-context-menu-${uuidV4()}`;\n targetElement.setAttribute('aria-controls', menuId);\n\n const rowContextData = getRowContextData(data, paginationOptions || {}, targetElement);\n const options = getMenuItems(targetElement, column, rowContextData, view, translate);\n if (!options.length) return;\n\n setShowMenu(true);\n setMenuItems(options);\n setMenuContext({\n column,\n targetCell: targetElement,\n rowContextData,\n menuId\n });\n }\n },\n [selector, columns, data, paginationOptions, translate, view]\n );\n\n const onKeydown = useCallback(({ key }: KeyboardEvent) => {\n if (key === 'Escape') setShowMenu(false);\n }, []);\n\n useEffect(() => {\n const abortController = new AbortController();\n if (!domContainer) return;\n\n domContainer.addEventListener('contextmenu', contextMenuListener, {\n signal: abortController.signal\n });\n document.addEventListener('keydown', onKeydown, {\n signal: abortController.signal\n });\n\n return () => {\n abortController.abort();\n };\n }, [domContainer, contextMenuListener]);\n\n return showMenu && menuContext ? (\n <Popover ref={setPopperRef} target={menuContext.targetCell}>\n <Menu\n id={menuContext.menuId}\n items={menuItems}\n onItemClick={(_, e) => {\n e.preventDefault();\n setShowMenu(false);\n }}\n focusControlEl={menuContext.targetCell}\n className='action-menu'\n data-testid={TestIdConstants.contextMenu}\n // TODO: remove this older test-id syntax after checking usage across the test suites\n data-test-id='action-menu'\n />\n </Popover>\n ) : null;\n}\n"]}
@@ -0,0 +1,12 @@
1
+ import { FieldType, type RsCoreTypes } from 'pega-repeating-structures-core';
2
+ export type GroupAdditionalFieldData = RsCoreTypes.GroupGenerator['additionalFieldsData'][0];
3
+ export type GetAdditionalDataResponse = NonNullable<Awaited<ReturnType<RsCoreTypes.GroupGenerator['getAdditionalFieldData']>>>;
4
+ type FieldTypes = (typeof FieldType)[keyof typeof FieldType];
5
+ export declare const isDateLikeField: (type: FieldTypes) => type is typeof FieldType.DATE | typeof FieldType.DATE_TIME | typeof FieldType.DATE_ONLY;
6
+ declare const GroupAdditionalFieldDataModal: ({ groupHeader, additionalField, column }: {
7
+ groupHeader: RsCoreTypes.GroupGenerator;
8
+ additionalField: RsCoreTypes.GroupAdditionalField;
9
+ column: RsCoreTypes.Column;
10
+ }) => import("react/jsx-runtime").JSX.Element;
11
+ export default GroupAdditionalFieldDataModal;
12
+ //# sourceMappingURL=GroupAdditionalFieldDataModal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GroupAdditionalFieldDataModal.d.ts","sourceRoot":"","sources":["../../../../Core/Components/GroupRenderer/GroupAdditionalFieldDataModal.tsx"],"names":[],"mappings":"AAGA,OAAO,EAGL,SAAS,EACT,KAAK,WAAW,EACjB,MAAM,gCAAgC,CAAC;AASxC,MAAM,MAAM,wBAAwB,GAAG,WAAW,CAAC,cAAc,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,CAAC;AAC7F,MAAM,MAAM,yBAAyB,GAAG,WAAW,CACjD,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,cAAc,CAAC,wBAAwB,CAAC,CAAC,CAAC,CAC1E,CAAC;AACF,KAAK,UAAU,GAAG,CAAC,OAAO,SAAS,CAAC,CAAC,MAAM,OAAO,SAAS,CAAC,CAAC;AAK7D,eAAO,MAAM,eAAe,GAC1B,MAAM,UAAU,KACf,IAAI,IAAI,OAAO,SAAS,CAAC,IAAI,GAAG,OAAO,SAAS,CAAC,SAAS,GAAG,OAAO,SAAS,CAAC,SAEhF,CAAC;AAwEF,QAAA,MAAM,6BAA6B,GAAI,0CAIpC;IACD,WAAW,EAAE,WAAW,CAAC,cAAc,CAAC;IACxC,eAAe,EAAE,WAAW,CAAC,oBAAoB,CAAC;IAClD,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC;CAC5B,4CAyEA,CAAC;AAEF,eAAe,6BAA6B,CAAC"}
@@ -0,0 +1,62 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { memo, useCallback, useEffect, useState } from 'react';
3
+ import { Flex, Modal, UnorderedList } from '@pega/cosmos-react-core';
4
+ import { dateFunctionLabels, getGroupFromKey, FieldType } from 'pega-repeating-structures-core';
5
+ import useTranslate from '../../Hooks/useTranslate';
6
+ import { useFormattedAdditionalFieldData } from './GroupAdditionalInfo';
7
+ import { GroupName } from '.';
8
+ const DATE_TYPES = [FieldType.DATE, FieldType.DATE_TIME, FieldType.DATE_ONLY];
9
+ const ADDITIONAL_FIELDS_DATA_INITIAL_LIMIT = 10;
10
+ export const isDateLikeField = (type) => {
11
+ return DATE_TYPES.includes(type);
12
+ };
13
+ const GroupAdditionalFieldDataModalHeading = memo(({ groupHeader, column, view, dateFunction }) => {
14
+ const { label: groupHeaderLabel, groupBy } = groupHeader;
15
+ const { type: additionalFieldType } = column.field;
16
+ const { columns, state: { groups } } = view;
17
+ const [translate] = useTranslate();
18
+ const group = getGroupFromKey(groupBy, groups);
19
+ const groupHeaderColumn = columns?.find(c => c.field.id === group?.columnId);
20
+ // compute additional field label
21
+ const additionalFieldLabel = dateFunction && isDateLikeField(additionalFieldType)
22
+ ? `${column.label} (${translate(dateFunctionLabels[dateFunction])})`
23
+ : column.label;
24
+ return (_jsxs(Flex, { container: { alignItems: 'center', gap: 1 }, "data-testid": 'group-additional-field-data-modal-heading', children: [_jsx("span", { children: `${groupHeaderLabel}:` }), _jsxs("span", { children: [_jsx(GroupName, { view: view, column: groupHeaderColumn, groupHeader: groupHeader, dateFunction: group?.dateFunction, customFunction: group?.customFunction }), ","] }), _jsx("span", { children: additionalFieldLabel })] }));
25
+ });
26
+ const AdditionalFieldItemRenderer = ({ value, additionalField, column, groupHeader }) => {
27
+ const { renderer } = useFormattedAdditionalFieldData({ value, count: 1, id: additionalField.id }, additionalField, { column, meta: column.parent.meta, groupHeader }, 'GroupHeader');
28
+ return renderer;
29
+ };
30
+ const GroupAdditionalFieldDataModal = ({ groupHeader, additionalField, column }) => {
31
+ const view = column.parent;
32
+ const { getAdditionalFieldData } = groupHeader;
33
+ const [limit, setLimit] = useState(ADDITIONAL_FIELDS_DATA_INITIAL_LIMIT);
34
+ const [additionalFieldData, setAdditionalFieldData] = useState(null);
35
+ // Fetch additional field data once on mount
36
+ useEffect(() => {
37
+ let isActive = true;
38
+ (async () => {
39
+ const data = await getAdditionalFieldData(additionalField);
40
+ if (isActive && data) {
41
+ setAdditionalFieldData({ values: data.values, hasMore: data.hasMore });
42
+ }
43
+ else if (!data) {
44
+ setAdditionalFieldData({ values: [], hasMore: false });
45
+ }
46
+ })();
47
+ return () => {
48
+ isActive = false;
49
+ };
50
+ }, [groupHeader, additionalField]);
51
+ // Toggle between showing limited and all additional field values in unordered list.
52
+ const handleToggleShow = useCallback(() => {
53
+ setLimit(prev => prev === ADDITIONAL_FIELDS_DATA_INITIAL_LIMIT && additionalFieldData
54
+ ? additionalFieldData.values.length
55
+ : ADDITIONAL_FIELDS_DATA_INITIAL_LIMIT);
56
+ }, [additionalFieldData]);
57
+ const values = additionalFieldData?.values ?? [];
58
+ const hasMore = additionalFieldData?.hasMore ?? false;
59
+ return (_jsx(Modal, { autoWidth: true, heading: _jsx(GroupAdditionalFieldDataModalHeading, { column: column, dateFunction: 'dateFunction' in additionalField ? additionalField.dateFunction : undefined, groupHeader: groupHeader, view: view }), progress: !additionalFieldData, count: additionalFieldData ? { value: values.length, hasMore } : undefined, "data-testid": 'group-additional-field-data-modal', children: additionalFieldData && (_jsx(UnorderedList, { "data-testid": 'group-additional-field-data-modal-list', onToggleShow: values.length > ADDITIONAL_FIELDS_DATA_INITIAL_LIMIT ? handleToggleShow : undefined, count: values.length > ADDITIONAL_FIELDS_DATA_INITIAL_LIMIT ? values.length : undefined, items: values.slice(0, limit).map(value => (_jsx(AdditionalFieldItemRenderer, { value: value, additionalField: additionalField, column: column, groupHeader: groupHeader }))) })) }));
60
+ };
61
+ export default GroupAdditionalFieldDataModal;
62
+ //# sourceMappingURL=GroupAdditionalFieldDataModal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GroupAdditionalFieldDataModal.js","sourceRoot":"","sources":["../../../../Core/Components/GroupRenderer/GroupAdditionalFieldDataModal.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAE/D,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,aAAa,EAAsB,MAAM,yBAAyB,CAAC;AACzF,OAAO,EACL,kBAAkB,EAClB,eAAe,EACf,SAAS,EAEV,MAAM,gCAAgC,CAAC;AAGxC,OAAO,YAAY,MAAM,0BAA0B,CAAC;AAEpD,OAAO,EAAE,+BAA+B,EAAE,MAAM,uBAAuB,CAAC;AAExE,OAAO,EAAE,SAAS,EAAE,MAAM,GAAG,CAAC;AAQ9B,MAAM,UAAU,GAAsB,CAAC,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;AACjG,MAAM,oCAAoC,GAAG,EAAE,CAAC;AAEhD,MAAM,CAAC,MAAM,eAAe,GAAG,CAC7B,IAAgB,EACyE,EAAE;IAC3F,OAAO,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AACnC,CAAC,CAAC;AAEF,MAAM,oCAAoC,GAAG,IAAI,CAC/C,CAAC,EACC,WAAW,EACX,MAAM,EACN,IAAI,EACJ,YAAY,EAMb,EAAE,EAAE;IACH,MAAM,EAAE,KAAK,EAAE,gBAAgB,EAAE,OAAO,EAAE,GAAG,WAAW,CAAC;IACzD,MAAM,EAAE,IAAI,EAAE,mBAAmB,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC;IACnD,MAAM,EACJ,OAAO,EACP,KAAK,EAAE,EAAE,MAAM,EAAE,EAClB,GAAG,IAAI,CAAC;IACT,MAAM,CAAC,SAAS,CAAC,GAAG,YAAY,EAAE,CAAC;IAEnC,MAAM,KAAK,GAAG,eAAe,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC/C,MAAM,iBAAiB,GAAG,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,KAAK,KAAK,EAAE,QAAQ,CAAC,CAAC;IAC7E,iCAAiC;IACjC,MAAM,oBAAoB,GACxB,YAAY,IAAI,eAAe,CAAC,mBAAmB,CAAC;QAClD,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,KAAK,SAAS,CAAC,kBAAkB,CAAC,YAAY,CAAC,CAAC,GAAG;QACpE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;IAEnB,OAAO,CACL,MAAC,IAAI,IACH,SAAS,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,EAAE,iBAC/B,2CAA2C,aAEvD,yBAAO,GAAG,gBAAgB,GAAG,GAAQ,EACrC,2BACE,KAAC,SAAS,IACR,IAAI,EAAE,IAAI,EACV,MAAM,EAAE,iBAAiB,EACzB,WAAW,EAAE,WAAW,EACxB,YAAY,EAAE,KAAK,EAAE,YAAY,EACjC,cAAc,EAAE,KAAK,EAAE,cAAc,GACrC,SAEG,EACP,yBAAO,oBAAoB,GAAQ,IAC9B,CACR,CAAC;AACJ,CAAC,CACF,CAAC;AAEF,MAAM,2BAA2B,GAAG,CAAC,EACnC,KAAK,EACL,eAAe,EACf,MAAM,EACN,WAAW,EAMZ,EAAE,EAAE;IACH,MAAM,EAAE,QAAQ,EAAE,GAAG,+BAA+B,CAClD,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,eAAe,CAAC,EAAE,EAAE,EAC3C,eAAe,EACf,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW,EAAE,EACjD,aAAa,CACd,CAAC;IACF,OAAO,QAAQ,CAAC;AAClB,CAAC,CAAC;AAEF,MAAM,6BAA6B,GAAG,CAAC,EACrC,WAAW,EACX,eAAe,EACf,MAAM,EAKP,EAAE,EAAE;IACH,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC;IAC3B,MAAM,EAAE,sBAAsB,EAAE,GAAG,WAAW,CAAC;IAE/C,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,oCAAoC,CAAC,CAAC;IACzE,MAAM,CAAC,mBAAmB,EAAE,sBAAsB,CAAC,GAAG,QAAQ,CAC5D,IAAI,CACL,CAAC;IAEF,4CAA4C;IAC5C,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,QAAQ,GAAG,IAAI,CAAC;QACpB,CAAC,KAAK,IAAI,EAAE;YACV,MAAM,IAAI,GAAG,MAAM,sBAAsB,CAAC,eAAe,CAAC,CAAC;YAC3D,IAAI,QAAQ,IAAI,IAAI,EAAE,CAAC;gBACrB,sBAAsB,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;YACzE,CAAC;iBAAM,IAAI,CAAC,IAAI,EAAE,CAAC;gBACjB,sBAAsB,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;YACzD,CAAC;QACH,CAAC,CAAC,EAAE,CAAC;QACL,OAAO,GAAG,EAAE;YACV,QAAQ,GAAG,KAAK,CAAC;QACnB,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC,CAAC;IAEnC,oFAAoF;IACpF,MAAM,gBAAgB,GAAG,WAAW,CAAC,GAAG,EAAE;QACxC,QAAQ,CAAC,IAAI,CAAC,EAAE,CACd,IAAI,KAAK,oCAAoC,IAAI,mBAAmB;YAClE,CAAC,CAAC,mBAAmB,CAAC,MAAM,CAAC,MAAM;YACnC,CAAC,CAAC,oCAAoC,CACzC,CAAC;IACJ,CAAC,EAAE,CAAC,mBAAmB,CAAC,CAAC,CAAC;IAE1B,MAAM,MAAM,GAAG,mBAAmB,EAAE,MAAM,IAAI,EAAE,CAAC;IACjD,MAAM,OAAO,GAAG,mBAAmB,EAAE,OAAO,IAAI,KAAK,CAAC;IAEtD,OAAO,CACL,KAAC,KAAK,IACJ,SAAS,QACT,OAAO,EACL,KAAC,oCAAoC,IACnC,MAAM,EAAE,MAAM,EACd,YAAY,EACV,cAAc,IAAI,eAAe,CAAC,CAAC,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,EAE9E,WAAW,EAAE,WAAW,EACxB,IAAI,EAAE,IAAI,GACV,EAEJ,QAAQ,EAAE,CAAC,mBAAmB,EAC9B,KAAK,EAAE,mBAAmB,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,SAAS,iBAC9D,mCAAmC,YAE9C,mBAAmB,IAAI,CACtB,KAAC,aAAa,mBACA,wCAAwC,EACpD,YAAY,EACV,MAAM,CAAC,MAAM,GAAG,oCAAoC,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,SAAS,EAErF,KAAK,EAAE,MAAM,CAAC,MAAM,GAAG,oCAAoC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,EACvF,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CACzC,KAAC,2BAA2B,IAC1B,KAAK,EAAE,KAAK,EACZ,eAAe,EAAE,eAAe,EAChC,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,WAAW,GACxB,CACH,CAAC,GACF,CACH,GACK,CACT,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,6BAA6B,CAAC","sourcesContent":["import { memo, useCallback, useEffect, useState } from 'react';\n\nimport { Flex, Modal, UnorderedList, type ExcludeStrict } from '@pega/cosmos-react-core';\nimport {\n dateFunctionLabels,\n getGroupFromKey,\n FieldType,\n type RsCoreTypes\n} from 'pega-repeating-structures-core';\nimport type { DateFunction } from '@pega/cosmos-react-condition-builder/lib/components/ConditionBuilder/core/types';\n\nimport useTranslate from '../../Hooks/useTranslate';\n\nimport { useFormattedAdditionalFieldData } from './GroupAdditionalInfo';\n\nimport { GroupName } from '.';\n\nexport type GroupAdditionalFieldData = RsCoreTypes.GroupGenerator['additionalFieldsData'][0];\nexport type GetAdditionalDataResponse = NonNullable<\n Awaited<ReturnType<RsCoreTypes.GroupGenerator['getAdditionalFieldData']>>\n>;\ntype FieldTypes = (typeof FieldType)[keyof typeof FieldType];\n\nconst DATE_TYPES: readonly string[] = [FieldType.DATE, FieldType.DATE_TIME, FieldType.DATE_ONLY];\nconst ADDITIONAL_FIELDS_DATA_INITIAL_LIMIT = 10;\n\nexport const isDateLikeField = (\n type: FieldTypes\n): type is typeof FieldType.DATE | typeof FieldType.DATE_TIME | typeof FieldType.DATE_ONLY => {\n return DATE_TYPES.includes(type);\n};\n\nconst GroupAdditionalFieldDataModalHeading = memo(\n ({\n groupHeader,\n column,\n view,\n dateFunction\n }: {\n groupHeader: RsCoreTypes.GroupGenerator;\n column: RsCoreTypes.Column;\n view: RsCoreTypes.View;\n dateFunction: ExcludeStrict<DateFunction, 'SECONDS'> | undefined;\n }) => {\n const { label: groupHeaderLabel, groupBy } = groupHeader;\n const { type: additionalFieldType } = column.field;\n const {\n columns,\n state: { groups }\n } = view;\n const [translate] = useTranslate();\n\n const group = getGroupFromKey(groupBy, groups);\n const groupHeaderColumn = columns?.find(c => c.field.id === group?.columnId);\n // compute additional field label\n const additionalFieldLabel =\n dateFunction && isDateLikeField(additionalFieldType)\n ? `${column.label} (${translate(dateFunctionLabels[dateFunction])})`\n : column.label;\n\n return (\n <Flex\n container={{ alignItems: 'center', gap: 1 }}\n data-testid='group-additional-field-data-modal-heading'\n >\n <span>{`${groupHeaderLabel}:`}</span>\n <span>\n <GroupName\n view={view}\n column={groupHeaderColumn}\n groupHeader={groupHeader}\n dateFunction={group?.dateFunction}\n customFunction={group?.customFunction}\n />\n ,\n </span>\n <span>{additionalFieldLabel}</span>\n </Flex>\n );\n }\n);\n\nconst AdditionalFieldItemRenderer = ({\n value,\n additionalField,\n column,\n groupHeader\n}: {\n value: GroupAdditionalFieldData['value'];\n additionalField: RsCoreTypes.GroupAdditionalField;\n column: RsCoreTypes.Column;\n groupHeader: RsCoreTypes.GroupGenerator;\n}) => {\n const { renderer } = useFormattedAdditionalFieldData(\n { value, count: 1, id: additionalField.id },\n additionalField,\n { column, meta: column.parent.meta, groupHeader },\n 'GroupHeader'\n );\n return renderer;\n};\n\nconst GroupAdditionalFieldDataModal = ({\n groupHeader,\n additionalField,\n column\n}: {\n groupHeader: RsCoreTypes.GroupGenerator;\n additionalField: RsCoreTypes.GroupAdditionalField;\n column: RsCoreTypes.Column;\n}) => {\n const view = column.parent;\n const { getAdditionalFieldData } = groupHeader;\n\n const [limit, setLimit] = useState(ADDITIONAL_FIELDS_DATA_INITIAL_LIMIT);\n const [additionalFieldData, setAdditionalFieldData] = useState<GetAdditionalDataResponse | null>(\n null\n );\n\n // Fetch additional field data once on mount\n useEffect(() => {\n let isActive = true;\n (async () => {\n const data = await getAdditionalFieldData(additionalField);\n if (isActive && data) {\n setAdditionalFieldData({ values: data.values, hasMore: data.hasMore });\n } else if (!data) {\n setAdditionalFieldData({ values: [], hasMore: false });\n }\n })();\n return () => {\n isActive = false;\n };\n }, [groupHeader, additionalField]);\n\n // Toggle between showing limited and all additional field values in unordered list.\n const handleToggleShow = useCallback(() => {\n setLimit(prev =>\n prev === ADDITIONAL_FIELDS_DATA_INITIAL_LIMIT && additionalFieldData\n ? additionalFieldData.values.length\n : ADDITIONAL_FIELDS_DATA_INITIAL_LIMIT\n );\n }, [additionalFieldData]);\n\n const values = additionalFieldData?.values ?? [];\n const hasMore = additionalFieldData?.hasMore ?? false;\n\n return (\n <Modal\n autoWidth\n heading={\n <GroupAdditionalFieldDataModalHeading\n column={column}\n dateFunction={\n 'dateFunction' in additionalField ? additionalField.dateFunction : undefined\n }\n groupHeader={groupHeader}\n view={view}\n />\n }\n progress={!additionalFieldData}\n count={additionalFieldData ? { value: values.length, hasMore } : undefined}\n data-testid='group-additional-field-data-modal'\n >\n {additionalFieldData && (\n <UnorderedList\n data-testid='group-additional-field-data-modal-list'\n onToggleShow={\n values.length > ADDITIONAL_FIELDS_DATA_INITIAL_LIMIT ? handleToggleShow : undefined\n }\n count={values.length > ADDITIONAL_FIELDS_DATA_INITIAL_LIMIT ? values.length : undefined}\n items={values.slice(0, limit).map(value => (\n <AdditionalFieldItemRenderer\n value={value}\n additionalField={additionalField}\n column={column}\n groupHeader={groupHeader}\n />\n ))}\n />\n )}\n </Modal>\n );\n};\n\nexport default GroupAdditionalFieldDataModal;\n"]}
@@ -0,0 +1,33 @@
1
+ import { type RsCoreTypes } from 'pega-repeating-structures-core';
2
+ import { type GroupAdditionalFieldData } from './GroupAdditionalFieldDataModal';
3
+ type AdditionalFieldRendererContext = 'GroupHeader' | 'GroupHeaderTooltip';
4
+ type GroupAdditionalInfoProps = {
5
+ additionalFieldData: GroupAdditionalFieldData;
6
+ columns: RsCoreTypes.Column[];
7
+ groupHeader: RsCoreTypes.GroupGenerator;
8
+ additionalField: RsCoreTypes.GroupAdditionalField;
9
+ rendererContext: AdditionalFieldRendererContext;
10
+ };
11
+ export declare const useFormattedAdditionalFieldData: (additionalFieldData: GroupAdditionalFieldData, additionalField: RsCoreTypes.GroupAdditionalField, { column, meta, groupHeader }: {
12
+ column: RsCoreTypes.Column | null;
13
+ meta: RsCoreTypes.Meta | null;
14
+ groupHeader: RsCoreTypes.GroupGenerator;
15
+ }, rendererContext: AdditionalFieldRendererContext) => {
16
+ label: null;
17
+ renderer: null;
18
+ } | {
19
+ label: string;
20
+ renderer: string | number | null;
21
+ } | {
22
+ label: string;
23
+ renderer: import("react/jsx-runtime").JSX.Element | null;
24
+ } | {
25
+ label: string;
26
+ renderer: import("react/jsx-runtime").JSX.Element | "Multiple";
27
+ } | {
28
+ label: string | undefined;
29
+ renderer: import("react/jsx-runtime").JSX.Element;
30
+ };
31
+ declare const GroupAdditionalInfo: ({ additionalFieldData, columns, groupHeader, additionalField, rendererContext }: GroupAdditionalInfoProps) => import("react/jsx-runtime").JSX.Element | null;
32
+ export default GroupAdditionalInfo;
33
+ //# sourceMappingURL=GroupAdditionalInfo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GroupAdditionalInfo.d.ts","sourceRoot":"","sources":["../../../../Core/Components/GroupRenderer/GroupAdditionalInfo.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAiC,KAAK,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAcjG,OAAsC,EAEpC,KAAK,wBAAwB,EAC9B,MAAM,iCAAiC,CAAC;AAEzC,KAAK,8BAA8B,GAAG,aAAa,GAAG,oBAAoB,CAAC;AAC3E,KAAK,wBAAwB,GAAG;IAC9B,mBAAmB,EAAE,wBAAwB,CAAC;IAC9C,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,CAAC;IAC9B,WAAW,EAAE,WAAW,CAAC,cAAc,CAAC;IACxC,eAAe,EAAE,WAAW,CAAC,oBAAoB,CAAC;IAClD,eAAe,EAAE,8BAA8B,CAAC;CACjD,CAAC;AAgCF,eAAO,MAAM,+BAA+B,GAC1C,qBAAqB,wBAAwB,EAC7C,iBAAiB,WAAW,CAAC,oBAAoB,EACjD,+BAIG;IACD,MAAM,EAAE,WAAW,CAAC,MAAM,GAAG,IAAI,CAAC;IAClC,IAAI,EAAE,WAAW,CAAC,IAAI,GAAG,IAAI,CAAC;IAC9B,WAAW,EAAE,WAAW,CAAC,cAAc,CAAC;CACzC,EACD,iBAAiB,8BAA8B;;;;;;;;;;;;;;;CAyGhD,CAAC;AAEF,QAAA,MAAM,mBAAmB,GAAI,iFAM1B,wBAAwB,mDAqC1B,CAAC;AAEF,eAAe,mBAAmB,CAAC"}