@pega/dx-component-builder-sdk 24.2.14 → 24.2.15

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 (127) hide show
  1. package/package.json +1 -1
  2. package/src/tasks/create/templates/SDK-React/field/Icon-Button-URL/index.tsx.mustache +1 -1
  3. package/src/tasks/create/templates/SDK-React/field/Picklist/index.tsx.mustache +7 -4
  4. package/src/tasks/create/templates/SDK-React/field/Picklist-RadioButtons/index.tsx.mustache +3 -2
  5. package/src/tasks/create/templates/SDK-React/widget/PAGE-CASE/index.tsx.mustache +1 -0
  6. package/tests/assets/sdk-r/components/create/custom-constellation/field/Pega_DXIL_MyTestText/demo.stories.tsx +0 -1
  7. package/tests/assets/sdk-r/components/create/override-sdk/designSystemExtension/FieldValueList/FieldValueList.tsx +2 -2
  8. package/tests/assets/sdk-r/components/create/override-sdk/designSystemExtension/RichTextEditor/RichTextEditor.tsx +4 -4
  9. package/tests/assets/sdk-r/components/create/override-sdk/field/CancelAlert/CancelAlert.tsx +1 -4
  10. package/tests/assets/sdk-r/components/create/override-sdk/field/Currency/Currency.tsx +8 -5
  11. package/tests/assets/sdk-r/components/create/override-sdk/field/Date/Date.tsx +5 -1
  12. package/tests/assets/sdk-r/components/create/override-sdk/field/DateTime/DateTime.tsx +13 -5
  13. package/tests/assets/sdk-r/components/create/override-sdk/field/Decimal/Decimal.tsx +7 -2
  14. package/tests/assets/sdk-r/components/create/override-sdk/field/Dropdown/Dropdown.tsx +34 -24
  15. package/tests/assets/sdk-r/components/create/override-sdk/field/Percentage/Percentage.tsx +6 -2
  16. package/tests/assets/sdk-r/components/create/override-sdk/field/RadioButtons/RadioButtons.tsx +3 -5
  17. package/tests/assets/sdk-r/components/create/override-sdk/field/ScalarList/ScalarList.tsx +1 -2
  18. package/tests/assets/sdk-r/components/create/override-sdk/field/Time/Time.tsx +1 -1
  19. package/tests/assets/sdk-r/components/create/override-sdk/field/UserReference/UserReference.tsx +1 -3
  20. package/tests/assets/sdk-r/components/create/override-sdk/infra/Assignment/Assignment.tsx +2 -6
  21. package/tests/assets/sdk-r/components/create/override-sdk/infra/DashboardFilter/DashboardFilter.tsx +2 -3
  22. package/tests/assets/sdk-r/components/create/override-sdk/infra/DashboardFilter/filterUtils.tsx +1 -3
  23. package/tests/assets/sdk-r/components/create/override-sdk/infra/DeferLoad/DeferLoad.tsx +5 -5
  24. package/tests/assets/sdk-r/components/create/override-sdk/infra/FlowContainer/FlowContainer.tsx +18 -108
  25. package/tests/assets/sdk-r/components/create/override-sdk/infra/FlowContainer/helpers.ts +1 -5
  26. package/tests/assets/sdk-r/components/create/override-sdk/infra/ModalViewContainer/ListViewActionButtons/ListViewActionButtons.tsx +3 -1
  27. package/tests/assets/sdk-r/components/create/override-sdk/infra/MultiStep/MultiStep.tsx +1 -6
  28. package/tests/assets/sdk-r/components/create/override-sdk/infra/RootContainer/RootContainer.tsx +1 -1
  29. package/tests/assets/sdk-r/components/create/override-sdk/infra/SimpleView/helper.ts +1 -1
  30. package/tests/assets/sdk-r/components/create/override-sdk/template/AppShell/AppShell.tsx +6 -6
  31. package/tests/assets/sdk-r/components/create/override-sdk/template/CaseView/CaseView.tsx +5 -4
  32. package/tests/assets/sdk-r/components/create/override-sdk/template/Confirmation/Confirmation.tsx +1 -1
  33. package/tests/assets/sdk-r/components/create/override-sdk/template/DynamicTabs/DynamicTabs.tsx +0 -1
  34. package/tests/assets/sdk-r/components/create/override-sdk/template/FieldGroupTemplate/FieldGroupTemplate.tsx +10 -5
  35. package/tests/assets/sdk-r/components/create/override-sdk/template/ListView/ListView.tsx +13 -9
  36. package/tests/assets/sdk-r/components/create/override-sdk/template/ListView/hooks.ts +2 -0
  37. package/tests/assets/sdk-r/components/create/override-sdk/template/ListView/utils.ts +0 -1
  38. package/tests/assets/sdk-r/components/create/override-sdk/template/PromotedFilters/PromotedFilters.tsx +0 -1
  39. package/tests/assets/sdk-r/components/create/override-sdk/template/SimpleTable/SimpleTable.tsx +0 -2
  40. package/tests/assets/sdk-r/components/create/override-sdk/template/SimpleTableManual/SimpleTableManual.tsx +111 -94
  41. package/tests/assets/sdk-r/components/create/override-sdk/template/SimpleTableSelect/SimpleTableSelect.tsx +2 -4
  42. package/tests/assets/sdk-r/components/create/override-sdk/widget/Attachment/Attachment.css +1 -0
  43. package/tests/assets/sdk-r/components/create/override-sdk/widget/Attachment/Attachment.tsx +91 -73
  44. package/tests/assets/sdk-r/components/create/override-sdk/widget/FileUtility/FileUtility.tsx +1 -1
  45. package/tests/assets/sdk-r/components/create/override-sdk/widget/QuickCreate/QuickCreate.tsx +0 -1
  46. package/tests/assets/sdk-r/components/create/override-sdk/widget/SummaryItem/SummaryItem.tsx +1 -1
  47. package/tests/assets/sdk-r/components/create/override-sdk/widget/ToDo/ToDo.tsx +1 -1
  48. package/tests/assets/sdk-r/components/createAll/custom-constellation/field/Pega_DXIL_MyCurrency/demo.stories.tsx +0 -1
  49. package/tests/assets/sdk-r/components/createAll/custom-constellation/field/Pega_DXIL_MyDate/demo.stories.tsx +0 -16
  50. package/tests/assets/sdk-r/components/createAll/custom-constellation/field/Pega_DXIL_MyDateTime/demo.stories.tsx +0 -17
  51. package/tests/assets/sdk-r/components/createAll/custom-constellation/field/Pega_DXIL_MyDecimal/demo.stories.tsx +0 -1
  52. package/tests/assets/sdk-r/components/createAll/custom-constellation/field/Pega_DXIL_MyEmail/demo.stories.tsx +0 -1
  53. package/tests/assets/sdk-r/components/createAll/custom-constellation/field/Pega_DXIL_MyEmail/mock.ts +1 -0
  54. package/tests/assets/sdk-r/components/createAll/custom-constellation/field/Pega_DXIL_MyIconButtonURL/demo.stories.tsx +9 -20
  55. package/tests/assets/sdk-r/components/createAll/custom-constellation/field/Pega_DXIL_MyParagraph/demo.stories.tsx +0 -1
  56. package/tests/assets/sdk-r/components/createAll/custom-constellation/field/Pega_DXIL_MyPercentage/demo.stories.tsx +0 -1
  57. package/tests/assets/sdk-r/components/createAll/custom-constellation/field/Pega_DXIL_MyPercentage/mock.ts +1 -0
  58. package/tests/assets/sdk-r/components/createAll/custom-constellation/field/Pega_DXIL_MyPhone/demo.stories.tsx +1 -2
  59. package/tests/assets/sdk-r/components/createAll/custom-constellation/field/Pega_DXIL_MyPicklist/demo.stories.tsx +0 -1
  60. package/tests/assets/sdk-r/components/createAll/custom-constellation/field/Pega_DXIL_MyRadiobuttons/demo.stories.tsx +0 -1
  61. package/tests/assets/sdk-r/components/createAll/custom-constellation/field/Pega_DXIL_MySearchbox/demo.stories.tsx +0 -1
  62. package/tests/assets/sdk-r/components/createAll/custom-constellation/field/Pega_DXIL_MyText/demo.stories.tsx +0 -1
  63. package/tests/assets/sdk-r/components/createAll/custom-constellation/field/Pega_DXIL_MyTextInput/demo.stories.tsx +0 -1
  64. package/tests/assets/sdk-r/components/createAll/custom-constellation/field/Pega_DXIL_MyTimeOfDay/demo.stories.tsx +0 -1
  65. package/tests/assets/sdk-r/components/createAll/custom-constellation/field/Pega_DXIL_MyURL/demo.stories.tsx +0 -1
  66. package/tests/assets/sdk-r/components/createAll/custom-constellation/template/Pega_DXIL_MyDetails/demo.stories.tsx +10 -0
  67. package/tests/assets/sdk-r/components/createAll/custom-constellation/template/Pega_DXIL_MyPage/demo.stories.tsx +1 -13
  68. package/tests/assets/sdk-r/components/createAll/custom-constellation/widget/Pega_DXIL_MyCaseWidget/demo.stories.tsx +10 -32
  69. package/tests/assets/sdk-r/components/createAll/custom-constellation/widget/Pega_DXIL_MyPageCaseWidget/demo.stories.tsx +10 -22
  70. package/tests/assets/sdk-r/components/createAll/custom-constellation/widget/Pega_DXIL_MyPageWidget/demo.stories.tsx +10 -21
  71. package/tests/assets/sdk-r/components/createAll/custom-sdk/field/Pega_DXIL_MyCurrency/demo.stories.tsx +0 -14
  72. package/tests/assets/sdk-r/components/createAll/custom-sdk/field/Pega_DXIL_MyDate/demo.stories.tsx +0 -24
  73. package/tests/assets/sdk-r/components/createAll/custom-sdk/field/Pega_DXIL_MyDateTime/demo.stories.tsx +0 -24
  74. package/tests/assets/sdk-r/components/createAll/custom-sdk/field/Pega_DXIL_MyDecimal/demo.stories.tsx +0 -14
  75. package/tests/assets/sdk-r/components/createAll/custom-sdk/field/Pega_DXIL_MyIconButtonURL/demo.stories.tsx +2 -6
  76. package/tests/assets/sdk-r/components/createAll/custom-sdk/field/Pega_DXIL_MyIconButtonURL/index.tsx +1 -1
  77. package/tests/assets/sdk-r/components/createAll/custom-sdk/field/Pega_DXIL_MyPercentage/demo.stories.tsx +0 -14
  78. package/tests/assets/sdk-r/components/createAll/custom-sdk/field/Pega_DXIL_MyPicklist/index.tsx +7 -4
  79. package/tests/assets/sdk-r/components/createAll/custom-sdk/field/Pega_DXIL_MyRadiobuttons/index.tsx +3 -2
  80. package/tests/assets/sdk-r/components/createAll/custom-sdk/template/Pega_DXIL_MyDetails/demo.stories.tsx +8 -28
  81. package/tests/assets/sdk-r/components/createAll/custom-sdk/template/Pega_DXIL_MyForm/demo.stories.tsx +10 -16
  82. package/tests/assets/sdk-r/components/createAll/custom-sdk/template/Pega_DXIL_MyTwoColumnDetails/demo.stories.tsx +8 -28
  83. package/tests/assets/sdk-r/components/createAll/custom-sdk/widget/Pega_DXIL_MyCaseWidget/demo.stories.tsx +10 -20
  84. package/tests/assets/sdk-r/components/createAll/custom-sdk/widget/Pega_DXIL_MyPageCaseWidget/demo.stories.tsx +10 -20
  85. package/tests/assets/sdk-r/components/createAll/custom-sdk/widget/Pega_DXIL_MyPageCaseWidget/index.tsx +1 -0
  86. package/tests/assets/sdk-r/components/createAll/custom-sdk/widget/Pega_DXIL_MyPageWidget/demo.stories.tsx +9 -19
  87. package/tests/assets/sdk-r/components/createAll/override-sdk/designSystemExtension/FieldValueList/FieldValueList.tsx +2 -2
  88. package/tests/assets/sdk-r/components/createAll/override-sdk/designSystemExtension/RichTextEditor/RichTextEditor.tsx +4 -4
  89. package/tests/assets/sdk-r/components/createAll/override-sdk/field/CancelAlert/CancelAlert.tsx +1 -4
  90. package/tests/assets/sdk-r/components/createAll/override-sdk/field/Currency/Currency.tsx +8 -5
  91. package/tests/assets/sdk-r/components/createAll/override-sdk/field/Date/Date.tsx +5 -1
  92. package/tests/assets/sdk-r/components/createAll/override-sdk/field/DateTime/DateTime.tsx +13 -5
  93. package/tests/assets/sdk-r/components/createAll/override-sdk/field/Decimal/Decimal.tsx +7 -2
  94. package/tests/assets/sdk-r/components/createAll/override-sdk/field/Dropdown/Dropdown.tsx +34 -24
  95. package/tests/assets/sdk-r/components/createAll/override-sdk/field/Percentage/Percentage.tsx +6 -2
  96. package/tests/assets/sdk-r/components/createAll/override-sdk/field/RadioButtons/RadioButtons.tsx +3 -5
  97. package/tests/assets/sdk-r/components/createAll/override-sdk/field/ScalarList/ScalarList.tsx +1 -2
  98. package/tests/assets/sdk-r/components/createAll/override-sdk/field/Time/Time.tsx +1 -1
  99. package/tests/assets/sdk-r/components/createAll/override-sdk/field/UserReference/UserReference.tsx +1 -3
  100. package/tests/assets/sdk-r/components/createAll/override-sdk/infra/Assignment/Assignment.tsx +2 -6
  101. package/tests/assets/sdk-r/components/createAll/override-sdk/infra/DashboardFilter/DashboardFilter.tsx +2 -3
  102. package/tests/assets/sdk-r/components/createAll/override-sdk/infra/DashboardFilter/filterUtils.tsx +1 -3
  103. package/tests/assets/sdk-r/components/createAll/override-sdk/infra/DeferLoad/DeferLoad.tsx +5 -5
  104. package/tests/assets/sdk-r/components/createAll/override-sdk/infra/FlowContainer/FlowContainer.tsx +18 -108
  105. package/tests/assets/sdk-r/components/createAll/override-sdk/infra/FlowContainer/helpers.ts +1 -5
  106. package/tests/assets/sdk-r/components/createAll/override-sdk/infra/ModalViewContainer/ListViewActionButtons/ListViewActionButtons.tsx +3 -1
  107. package/tests/assets/sdk-r/components/createAll/override-sdk/infra/MultiStep/MultiStep.tsx +1 -6
  108. package/tests/assets/sdk-r/components/createAll/override-sdk/infra/RootContainer/RootContainer.tsx +1 -1
  109. package/tests/assets/sdk-r/components/createAll/override-sdk/infra/SimpleView/helper.ts +1 -1
  110. package/tests/assets/sdk-r/components/createAll/override-sdk/template/AppShell/AppShell.tsx +6 -6
  111. package/tests/assets/sdk-r/components/createAll/override-sdk/template/CaseView/CaseView.tsx +5 -4
  112. package/tests/assets/sdk-r/components/createAll/override-sdk/template/Confirmation/Confirmation.tsx +1 -1
  113. package/tests/assets/sdk-r/components/createAll/override-sdk/template/DynamicTabs/DynamicTabs.tsx +0 -1
  114. package/tests/assets/sdk-r/components/createAll/override-sdk/template/FieldGroupTemplate/FieldGroupTemplate.tsx +10 -5
  115. package/tests/assets/sdk-r/components/createAll/override-sdk/template/ListView/ListView.tsx +13 -9
  116. package/tests/assets/sdk-r/components/createAll/override-sdk/template/ListView/hooks.ts +2 -0
  117. package/tests/assets/sdk-r/components/createAll/override-sdk/template/ListView/utils.ts +0 -1
  118. package/tests/assets/sdk-r/components/createAll/override-sdk/template/PromotedFilters/PromotedFilters.tsx +0 -1
  119. package/tests/assets/sdk-r/components/createAll/override-sdk/template/SimpleTable/SimpleTable.tsx +0 -2
  120. package/tests/assets/sdk-r/components/createAll/override-sdk/template/SimpleTableManual/SimpleTableManual.tsx +111 -94
  121. package/tests/assets/sdk-r/components/createAll/override-sdk/template/SimpleTableSelect/SimpleTableSelect.tsx +2 -4
  122. package/tests/assets/sdk-r/components/createAll/override-sdk/widget/Attachment/Attachment.css +1 -0
  123. package/tests/assets/sdk-r/components/createAll/override-sdk/widget/Attachment/Attachment.tsx +91 -73
  124. package/tests/assets/sdk-r/components/createAll/override-sdk/widget/FileUtility/FileUtility.tsx +1 -1
  125. package/tests/assets/sdk-r/components/createAll/override-sdk/widget/QuickCreate/QuickCreate.tsx +0 -1
  126. package/tests/assets/sdk-r/components/createAll/override-sdk/widget/SummaryItem/SummaryItem.tsx +1 -1
  127. package/tests/assets/sdk-r/components/createAll/override-sdk/widget/ToDo/ToDo.tsx +1 -1
@@ -1,4 +1,3 @@
1
- /* eslint-disable no-nested-ternary */
2
1
  import React, { PropsWithChildren, useEffect, useLayoutEffect, useRef, useState } from 'react';
3
2
  import Table from '@mui/material/Table';
4
3
  import TableBody from '@mui/material/TableBody';
@@ -28,6 +27,7 @@ import createPConnectComponent from '@pega/react-sdk-components/lib/bridge/react
28
27
  import { Utils } from '@pega/react-sdk-components/lib/components/helpers/utils';
29
28
  import { getReferenceList } from '@pega/react-sdk-components/lib/components/helpers/field-group-utils';
30
29
  import { getDataPage } from '@pega/react-sdk-components/lib/components/helpers/data_page';
30
+ import { getGenericFieldsLocalizedValue } from '@pega/react-sdk-components/lib/components/helpers/common-utils';
31
31
  import { buildFieldsForTable, filterData, getContext } from '@pega/react-sdk-components/lib/components/helpers/simpleTableHelpers';
32
32
  import { PConnProps } from '@pega/react-sdk-components/lib/types/PConnProps';
33
33
  import { format } from '@pega/react-sdk-components/lib/components/helpers/formatters';
@@ -52,12 +52,27 @@ interface SimpleTableManualProps extends PConnProps {
52
52
  displayMode?: string;
53
53
  useSeparateViewForEdit: any;
54
54
  viewForEditModal: any;
55
+ validatemessage?: string;
56
+ required?: boolean;
55
57
  }
56
58
 
57
59
  const useStyles = makeStyles((/* theme */) => ({
58
60
  label: {
59
61
  margin: '8px'
60
62
  },
63
+ tableLabel: {
64
+ '&::after': {
65
+ display: 'inline',
66
+ content: '" *"',
67
+ verticalAlign: 'top',
68
+ color: 'var(--app-error-color)'
69
+ }
70
+ },
71
+ message: {
72
+ margin: '8px',
73
+ color: 'var(--app-error-color)',
74
+ fontSize: '14px'
75
+ },
61
76
  header: {
62
77
  background: '#f5f5f5'
63
78
  },
@@ -85,9 +100,6 @@ let menuColumnId = '';
85
100
  let menuColumnType = '';
86
101
  let menuColumnLabel = '';
87
102
 
88
- const filterByColumns: any[] = [];
89
- let myRows: any[];
90
-
91
103
  export default function SimpleTableManual(props: PropsWithChildren<SimpleTableManualProps>) {
92
104
  const classes = useStyles();
93
105
  const {
@@ -110,7 +122,9 @@ export default function SimpleTableManual(props: PropsWithChildren<SimpleTableMa
110
122
  editModeConfig,
111
123
  displayMode,
112
124
  useSeparateViewForEdit,
113
- viewForEditModal
125
+ viewForEditModal,
126
+ required,
127
+ validatemessage
114
128
  } = props;
115
129
  const pConn = getPConnect();
116
130
  const [rowData, setRowData] = useState([]);
@@ -130,7 +144,10 @@ export default function SimpleTableManual(props: PropsWithChildren<SimpleTableMa
130
144
  const [displayDialogDateFilter, setDisplayDialogDateFilter] = useState<string>('notequal');
131
145
  const [displayDialogDateValue, setDisplayDialogDateValue] = useState<string>('');
132
146
  const selectedRowIndex: any = useRef(null);
133
-
147
+ const myRowsRef = useRef<any[]>([]);
148
+ const filterByColumnsRef = useRef<any[]>([]);
149
+ const localizedVal = PCore.getLocaleUtils().getLocaleValue;
150
+ const localeCategory = 'SimpleTable';
134
151
  const parameters = fieldMetadata?.datasource?.parameters;
135
152
  const { referenceListStr } = getContext(getPConnect());
136
153
  const label = labelProp || propertyLabel;
@@ -176,13 +193,8 @@ export default function SimpleTableManual(props: PropsWithChildren<SimpleTableMa
176
193
  });
177
194
 
178
195
  useEffect(() => {
179
- if (editableMode && !allowEditingInModal) {
180
- // eslint-disable-next-line @typescript-eslint/no-use-before-define
181
- buildElementsForTable();
182
- }
183
- }, [referenceList.length]);
184
-
185
- useEffect(() => {
196
+ // eslint-disable-next-line @typescript-eslint/no-use-before-define
197
+ buildElementsForTable();
186
198
  if (readOnlyMode || allowEditingInModal) {
187
199
  // eslint-disable-next-line @typescript-eslint/no-use-before-define
188
200
  generateRowsData();
@@ -201,10 +213,10 @@ export default function SimpleTableManual(props: PropsWithChildren<SimpleTableMa
201
213
  if (allowEditingInModal) {
202
214
  getPConnect()
203
215
  .getListActions()
204
- // @ts-ignore - An argument for 'uniqueField' was not provided.
205
216
  .initDefaultPageInstructions(
206
217
  getPConnect().getReferenceList(),
207
- fieldDefs.filter(item => item.name).map(item => item.name)
218
+ // Temporary filter for attachments to align with constellation payload behavior.
219
+ fieldDefs.filter(item => item.name && item.meta?.type !== 'Attachment').map(item => item.name)
208
220
  );
209
221
  } else {
210
222
  // @ts-ignore - An argument for 'fields' was not provided
@@ -238,8 +250,10 @@ export default function SimpleTableManual(props: PropsWithChildren<SimpleTableMa
238
250
  // See what data (if any) we have to display
239
251
  const refKeys: string[] = inColKey?.split('.');
240
252
  let valBuilder = inRowData;
253
+ let index = 0;
241
254
  for (const key of refKeys) {
242
- valBuilder = valBuilder[key];
255
+ index += 1;
256
+ valBuilder = valBuilder[key] !== undefined || index === refKeys.length ? valBuilder[key] : valBuilder;
243
257
  }
244
258
  return getFormattedValue(valBuilder, inColKey);
245
259
  }
@@ -247,21 +261,25 @@ export default function SimpleTableManual(props: PropsWithChildren<SimpleTableMa
247
261
  const formatRowsData = data => {
248
262
  if (!data) return {};
249
263
 
250
- return data.map(item => {
251
- return displayedColumns.reduce((dataForRow, colKey) => {
252
- dataForRow[colKey] = getRowValue(item, colKey);
253
- return dataForRow;
254
- }, {});
264
+ return data.map((item, idx) => {
265
+ const dataForRow = displayedColumns.reduce((acc, colKey) => {
266
+ acc[colKey] = getRowValue(item, colKey);
267
+ return acc;
268
+ }, {} as any);
269
+ dataForRow.__originalIndex = idx;
270
+ return dataForRow;
255
271
  });
256
272
  };
257
273
 
258
274
  function generateRowsData() {
275
+ myRowsRef.current = [];
276
+
259
277
  // if referenceList is empty and dataPageName property value exists then make a datapage fetch call and get the list of data.
260
278
  if (!referenceList.length && dataPageName) {
261
279
  getDataPage(dataPageName, parameters, context)
262
280
  .then(listData => {
263
281
  const data = formatRowsData(listData);
264
- myRows = data;
282
+ myRowsRef.current = data || [];
265
283
  setRowData(data);
266
284
  })
267
285
  .catch(e => {
@@ -273,16 +291,19 @@ export default function SimpleTableManual(props: PropsWithChildren<SimpleTableMa
273
291
  // in the table. So, iterate over referenceList to create the dataRows that
274
292
  // we're using as the table's dataSource
275
293
  const data: any = [];
276
- for (const row of referenceList) {
277
- const dataForRow: Object = {};
294
+ referenceList.forEach((row, idx) => {
295
+ const dataForRow: any = {};
278
296
  for (const col of displayedColumns) {
279
297
  const colKey: string = col;
280
298
  const theVal = getRowValue(row, colKey);
281
299
  dataForRow[colKey] = theVal || '';
282
300
  }
301
+ // Preserve the original position so stableSort can look up the right
302
+ // entry in `elements` even after filtering shrinks rowData.
303
+ dataForRow.__originalIndex = idx;
283
304
  data.push(dataForRow);
284
- myRows = data;
285
- }
305
+ });
306
+ myRowsRef.current = data;
286
307
  setRowData(data);
287
308
  }
288
309
  }
@@ -306,9 +327,9 @@ export default function SimpleTableManual(props: PropsWithChildren<SimpleTableMa
306
327
  if (allowEditingInModal && defaultView) {
307
328
  pConn
308
329
  .getActionsApi()
330
+ // @ts-ignore
309
331
  .openEmbeddedDataModal(defaultView, pConn, referenceListStr, referenceList.length, PCore.getConstants().RESOURCE_STATUS.CREATE);
310
332
  } else {
311
- // @ts-ignore - An argument for 'pageRef' was not provided.
312
333
  pConn.getListActions().insert({ classID: contextClass }, referenceList.length);
313
334
  }
314
335
 
@@ -322,6 +343,7 @@ export default function SimpleTableManual(props: PropsWithChildren<SimpleTableMa
322
343
  if (typeof selectedRowIndex.current === 'number') {
323
344
  pConn
324
345
  .getActionsApi()
346
+ // @ts-ignore
325
347
  .openEmbeddedDataModal(
326
348
  bUseSeparateViewForEdit ? editView : defaultView,
327
349
  pConn,
@@ -334,12 +356,10 @@ export default function SimpleTableManual(props: PropsWithChildren<SimpleTableMa
334
356
 
335
357
  const deleteRecord = () => {
336
358
  setEditAnchorEl(null);
337
- // @ts-ignore - An argument for 'pageRef' was not provided.
338
359
  pConn.getListActions().deleteEntry(selectedRowIndex.current);
339
360
  };
340
361
 
341
362
  const deleteRecordFromInlineEditable = (index: number) => {
342
- // @ts-ignore - An argument for 'pageRef' was not provided.
343
363
  pConn.getListActions().deleteEntry(index);
344
364
  };
345
365
 
@@ -349,7 +369,7 @@ export default function SimpleTableManual(props: PropsWithChildren<SimpleTableMa
349
369
  const data: any = [];
350
370
  rawFields.forEach(item => {
351
371
  // removing label field from config to hide title in the table cell
352
- item = { ...item, config: { ...item.config, label: '' } };
372
+ item = { ...item, config: { ...item.config, label: '', displayMode: readOnlyMode || allowEditingInModal ? 'DISPLAY_ONLY' : undefined } };
353
373
  const referenceListData = getReferenceList(pConn);
354
374
  const isDatapage = referenceListData.startsWith('D_');
355
375
  const pageReferenceValue = isDatapage
@@ -397,14 +417,15 @@ export default function SimpleTableManual(props: PropsWithChildren<SimpleTableMa
397
417
 
398
418
  type Order = 'asc' | 'desc';
399
419
 
400
- function getComparator<Key extends keyof any>(
401
- theOrder: Order,
402
- orderedBy: Key
403
- ): (a: { [key in Key]: number | string }, b: { [key in Key]: number | string }) => number {
404
- return theOrder === 'desc' ? (a, b) => descendingComparator(a, b, orderedBy) : (a, b) => -descendingComparator(a, b, orderedBy);
420
+ interface Comparator<T> {
421
+ (a: T, b: T): number;
405
422
  }
406
423
 
407
- function stableSort<T>(array: T[], comparator: (a: T, b: T) => number) {
424
+ function getComparator<Key extends keyof any, T extends Record<Key, any>>(theOrder: Order, orderedBy: Key): Comparator<T> {
425
+ return theOrder === 'desc' ? (a: T, b: T) => descendingComparator<T>(a, b, orderedBy) : (a: T, b: T) => -descendingComparator<T>(a, b, orderedBy);
426
+ }
427
+
428
+ function stableSort<T>(array: T[], comparator: (a: T, b: T) => number): T[] {
408
429
  const stabilizedThis = array.map((el, index) => [el, index] as [T, number]);
409
430
  stabilizedThis.sort((a, b) => {
410
431
  // eslint-disable-next-line @typescript-eslint/no-shadow
@@ -412,8 +433,7 @@ export default function SimpleTableManual(props: PropsWithChildren<SimpleTableMa
412
433
  if (order !== 0) return order;
413
434
  return a[1] - b[1];
414
435
  });
415
-
416
- return stabilizedThis.map(el => el[0]);
436
+ return stabilizedThis.map(([el]) => el);
417
437
  }
418
438
 
419
439
  function _menuClick(event, columnId: string, columnType: string, labelValue: string) {
@@ -439,7 +459,7 @@ export default function SimpleTableManual(props: PropsWithChildren<SimpleTableMa
439
459
 
440
460
  let bFound = false;
441
461
 
442
- for (const filterObj of filterByColumns) {
462
+ for (const filterObj of filterByColumnsRef.current) {
443
463
  if (filterObj.ref === menuColumnId) {
444
464
  setFilterBy(menuColumnLabel);
445
465
  if (filterObj.type === 'Date' || filterObj.type === 'DateTime' || filterObj.type === 'Time') {
@@ -505,10 +525,10 @@ export default function SimpleTableManual(props: PropsWithChildren<SimpleTableMa
505
525
 
506
526
  function filterSortGroupBy() {
507
527
  // get original data set
508
- let theData: any = myRows.slice();
528
+ let theData: any = myRowsRef.current?.slice();
509
529
 
510
530
  // last filter config data is global
511
- theData = theData.filter(filterData(filterByColumns));
531
+ theData = theData?.filter(filterData(filterByColumnsRef.current));
512
532
 
513
533
  // move data to array and then sort
514
534
  setRowData(theData);
@@ -516,7 +536,7 @@ export default function SimpleTableManual(props: PropsWithChildren<SimpleTableMa
516
536
 
517
537
  function updateFilterWithInfo() {
518
538
  let bFound = false;
519
- for (const filterObj of filterByColumns) {
539
+ for (const filterObj of filterByColumnsRef.current) {
520
540
  if (filterObj.ref === menuColumnId) {
521
541
  filterObj.type = filterType;
522
542
  if (containsDateOrTime) {
@@ -544,7 +564,7 @@ export default function SimpleTableManual(props: PropsWithChildren<SimpleTableMa
544
564
  filterObj.containsFilterValue = displayDialogContainsValue;
545
565
  }
546
566
 
547
- filterByColumns.push(filterObj);
567
+ filterByColumnsRef.current.push(filterObj);
548
568
  }
549
569
  }
550
570
 
@@ -556,7 +576,7 @@ export default function SimpleTableManual(props: PropsWithChildren<SimpleTableMa
556
576
  }
557
577
 
558
578
  function _showFilteredIcon(columnId) {
559
- for (const filterObj of filterByColumns) {
579
+ for (const filterObj of filterByColumnsRef.current) {
560
580
  if (filterObj.ref === columnId) {
561
581
  // eslint-disable-next-line sonarjs/prefer-single-boolean-return
562
582
  if (filterObj.containsFilterValue !== '') {
@@ -570,7 +590,7 @@ export default function SimpleTableManual(props: PropsWithChildren<SimpleTableMa
570
590
  }
571
591
 
572
592
  function results() {
573
- const len = editableMode ? elements.length : rowData.length;
593
+ const len = editableMode ? elements?.length : rowData?.length;
574
594
 
575
595
  return len ? (
576
596
  <span style={{ fontSize: '0.9em', opacity: '0.7' }}>
@@ -583,19 +603,21 @@ export default function SimpleTableManual(props: PropsWithChildren<SimpleTableMa
583
603
  <>
584
604
  <TableContainer component={Paper} style={{ margin: '4px 0px' }} id='simple-table-manual'>
585
605
  {propsToUse.label && (
586
- <h3 className={classes.label}>
606
+ <h3 className={`${classes.label} ${required ? classes.tableLabel : ''}`}>
587
607
  {propsToUse.label} {results()}
588
608
  </h3>
589
609
  )}
610
+ {validatemessage && <div className={classes.message}>{validatemessage}</div>}
590
611
  <Table>
591
612
  <TableHead className={classes.header}>
592
613
  <TableRow>
593
614
  {fieldDefs.map((field: any, index) => {
594
615
  return (
595
616
  <TableCell key={`head-${displayedColumns[index]}`} className={classes.tableCell}>
596
- {readOnlyMode ? (
597
- <div>
617
+ {(readOnlyMode || allowEditingInModal) && field.cellRenderer !== 'DeleteIcon' ? (
618
+ <div style={{ display: 'flex' }}>
598
619
  <TableSortLabel
620
+ style={{ width: '75%' }}
599
621
  active={orderBy === displayedColumns[index]}
600
622
  direction={orderBy === displayedColumns[index] ? order : 'asc'}
601
623
  onClick={createSortHandler(displayedColumns[index])}
@@ -607,8 +629,8 @@ export default function SimpleTableManual(props: PropsWithChildren<SimpleTableMa
607
629
  ) : null}
608
630
  </TableSortLabel>
609
631
  <MoreIcon
632
+ style={{ cursor: 'pointer', zIndex: 1000 }}
610
633
  id='menu-icon'
611
- className={classes.moreIcon}
612
634
  onClick={event => {
613
635
  _menuClick(event, field.name, field.meta.type, field.label);
614
636
  }}
@@ -624,11 +646,12 @@ export default function SimpleTableManual(props: PropsWithChildren<SimpleTableMa
624
646
  </TableHead>
625
647
  <TableBody>
626
648
  {editableMode &&
649
+ !allowEditingInModal &&
627
650
  elements.map((row: any, index) => {
628
651
  const theKey = `row-${index}`;
629
652
  return (
630
653
  <TableRow key={theKey}>
631
- {row.map((item, childIndex) => {
654
+ {row?.map((item, childIndex) => {
632
655
  const theColKey = `data-${index}-${childIndex}`;
633
656
  return (
634
657
  <TableCell key={theColKey} className={classes.tableCell}>
@@ -655,59 +678,53 @@ export default function SimpleTableManual(props: PropsWithChildren<SimpleTableMa
655
678
  {(readOnlyMode || allowEditingInModal) &&
656
679
  rowData &&
657
680
  rowData.length > 0 &&
658
- stableSort(rowData, getComparator(order, orderBy))
659
- .slice(0)
660
- .map((row, index) => {
661
- return (
662
- // eslint-disable-next-line react/no-array-index-key
663
- <TableRow key={index}>
664
- {displayedColumns.map(colKey => {
665
- return (
666
- <TableCell key={colKey} className={classes.tableCell}>
667
- {showDeleteButton && colKey === 'DeleteIcon' ? (
668
- <div>
669
- <MoreIcon
670
- id='table-edit-menu-icon'
671
- className={classes.moreIcon}
672
- onClick={event => {
673
- editMenuClick(event, index);
674
- }}
675
- />
676
- <Menu id='table-edit-menu' anchorEl={editAnchorEl} keepMounted open={Boolean(editAnchorEl)} onClose={_menuClose}>
677
- <MenuItem onClick={() => editRecord()}>Edit</MenuItem>
678
- <MenuItem onClick={() => deleteRecord()}>Delete</MenuItem>
679
- </Menu>
680
- </div>
681
- ) : typeof row[colKey] === 'boolean' && !row[colKey] ? (
682
- 'False'
683
- ) : typeof row[colKey] === 'boolean' && row[colKey] ? (
684
- 'True'
685
- ) : (
686
- row[colKey] || '---'
687
- )}
688
- </TableCell>
689
- );
690
- })}
691
- </TableRow>
692
- );
693
- })}
681
+ stableSort(rowData, getComparator(order, orderBy)).map((row: any, displayIndex) => {
682
+ const originalIndex = row.__originalIndex;
683
+ return (
684
+ // eslint-disable-next-line react/no-array-index-key
685
+ <TableRow key={displayIndex}>
686
+ {(elements as any[])[originalIndex]?.map((item, childIndex) => {
687
+ const theColKey = displayedColumns[childIndex];
688
+ return (
689
+ <TableCell key={theColKey} className={classes.tableCell}>
690
+ {item}
691
+ </TableCell>
692
+ );
693
+ })}
694
+ {showDeleteButton && (
695
+ <TableCell key='DeleteIcon' className={classes.tableCell}>
696
+ <div>
697
+ <MoreIcon
698
+ id='table-edit-menu-icon'
699
+ className={classes.moreIcon}
700
+ onClick={event => {
701
+ editMenuClick(event, originalIndex);
702
+ }}
703
+ />
704
+ <Menu id='table-edit-menu' anchorEl={editAnchorEl} keepMounted open={Boolean(editAnchorEl)} onClose={_menuClose}>
705
+ <MenuItem onClick={() => editRecord()}>Edit</MenuItem>
706
+ <MenuItem onClick={() => deleteRecord()}>Delete</MenuItem>
707
+ </Menu>
708
+ </div>
709
+ </TableCell>
710
+ )}
711
+ </TableRow>
712
+ );
713
+ })}
694
714
  </TableBody>
695
715
  </Table>
696
- {readOnlyMode && rowData && rowData.length === 0 && (
697
- <div className='no-records' id='no-records'>
698
- No records found.
699
- </div>
700
- )}
701
- {editableMode && referenceList && referenceList.length === 0 && (
716
+ {((readOnlyMode && (!rowData || rowData?.length === 0)) ||
717
+ (editableMode && (!referenceList || referenceList?.length === 0)) ||
718
+ (allowEditingInModal && (!rowData || rowData?.length === 0))) && (
702
719
  <div className='no-records' id='no-records'>
703
- No records found.
720
+ {getGenericFieldsLocalizedValue('CosmosFields.fields.lists', 'No records found.')}
704
721
  </div>
705
722
  )}
706
723
  </TableContainer>
707
724
  {showAddRowButton && (
708
725
  <div style={{ fontSize: '1rem' }}>
709
726
  <Link style={{ cursor: 'pointer' }} onClick={addRecord} underline='hover'>
710
- + Add
727
+ + {localizedVal('Add', localeCategory)}
711
728
  </Link>
712
729
  </div>
713
730
  )}
@@ -57,10 +57,8 @@ export default function SimpleTableSelect(props: SimpleTableSelectProps) {
57
57
 
58
58
  // Need to get this written so typedefs work
59
59
  const { datasource: { parameters: fieldParameters = {} } = {}, pageClass } = isMultiSelectMode
60
- ? // @ts-ignore - Property 'getFieldMetadata' is private and only accessible within class 'C11nEnv'.
61
- pConn.getFieldMetadata(`@P .${referenceProp}`)
62
- : // @ts-ignore - Property 'getCurrentPageFieldMetadata' is private and only accessible within class 'C11nEnv'.
63
- pConn.getCurrentPageFieldMetadata(contextPageReference);
60
+ ? pConn.getFieldMetadata(`@P .${referenceProp}`)
61
+ : pConn.getCurrentPageFieldMetadata(contextPageReference);
64
62
 
65
63
  const compositeKeys: any[] = [];
66
64
  Object.values(fieldParameters).forEach((param: any) => {
@@ -34,6 +34,7 @@
34
34
 
35
35
  .file-error {
36
36
  color: var(--app-error-color);
37
+ font-size: 14px;
37
38
  }
38
39
 
39
40
  .psdk-utility-card {