udp-react-enterprise-component-library 25.18.1-beta.74 → 25.18.1-beta.76

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 (29) hide show
  1. package/dist/UI/forms/index.js +1 -1
  2. package/dist/UI/index.js +1 -1
  3. package/dist/{UdpFormsSubmissionGrid-B3pQiK5q.js → UdpFormsSubmissionGrid-Qj-ti4hh.js} +57 -63
  4. package/dist/UdpFormsSubmissionGrid-Qj-ti4hh.js.map +1 -0
  5. package/dist/{UdpTransactionsPage-DXt_i8vP.js → UdpTransactionsPage-Dr3XbvFa.js} +111 -16
  6. package/dist/UdpTransactionsPage-Dr3XbvFa.js.map +1 -0
  7. package/dist/{forms-lyNriVSn.js → forms-sRKithEr.js} +15 -7
  8. package/dist/{forms-lyNriVSn.js.map → forms-sRKithEr.js.map} +1 -1
  9. package/dist/index.js +3 -3
  10. package/dist/types/src/UI/forms/UdpTransactionEmailForm.d.ts +6 -1
  11. package/dist/types/src/UI/forms/UdpTransactionEmailForm.d.ts.map +1 -1
  12. package/dist/types/src/hooks/useUdpGridFilterModel.d.ts +2 -0
  13. package/dist/types/src/hooks/useUdpGridFilterModel.d.ts.map +1 -0
  14. package/dist/types/src/maintenanceEngine/tableBrowser/TableColumnDefs.d.ts +1 -1
  15. package/dist/types/src/maintenanceEngine/tableBrowser/TableColumnDefs.d.ts.map +1 -1
  16. package/dist/types/src/udp/pages/UdpFormsSubmissionGrid/UdpFormsSubmissionGrid.d.ts.map +1 -1
  17. package/dist/types/src/udp/pages/UdpTransactionsPage/UdpTransactionGrid.d.ts.map +1 -1
  18. package/dist/types/src/udp/pages/UdpTransactionsPage/UdpTransactionSidesheet.d.ts.map +1 -1
  19. package/dist/types/src/udp/pages/UdpTransactionsPage/UdpTransactionsPage.d.ts.map +1 -1
  20. package/dist/types/src/udp/pages/UdpTransactionsPage/components/UdpTransactionCustomPage.d.ts.map +1 -1
  21. package/dist/types/src/udp/pages/UdpTransactionsPage/sidesheets/EditTransaction.d.ts.map +1 -1
  22. package/dist/types/tsconfig.tsbuildinfo +1 -1
  23. package/dist/udp/pages/UdpFormsSubmissionGrid/index.js +1 -1
  24. package/dist/udp/pages/UdpPages/index.js +1 -1
  25. package/dist/udp/pages/UdpTransactionsPage/index.js +1 -1
  26. package/export-map.json +1 -1
  27. package/package.json +1 -1
  28. package/dist/UdpFormsSubmissionGrid-B3pQiK5q.js.map +0 -1
  29. package/dist/UdpTransactionsPage-DXt_i8vP.js.map +0 -1
@@ -1,5 +1,5 @@
1
1
  import { n as UdpCrudFormFields, t as CrudForm } from "../../CrudForm-C9xMnPoA.js";
2
- import { n as PaymentReversalForm, r as LoginForm, t as UdpTransactionEmailForm } from "../../forms-lyNriVSn.js";
2
+ import { n as PaymentReversalForm, r as LoginForm, t as UdpTransactionEmailForm } from "../../forms-sRKithEr.js";
3
3
  import { t as VirtualForm } from "../../VirtualForm-Cw3gjug-.js";
4
4
 
5
5
  export { CrudForm, LoginForm, PaymentReversalForm, UdpCrudFormFields, UdpTransactionEmailForm, VirtualForm };
package/dist/UI/index.js CHANGED
@@ -38,7 +38,7 @@ import { t as FormControl } from "../FormControl-CkybPp4U.js";
38
38
  import { t as IndicatorChip } from "../IndicatorChip-Dmaib9uq.js";
39
39
  import { t as InputAdornment } from "../InputAdornment-CLuALIhc.js";
40
40
  import { n as UdpCrudFormFields, t as CrudForm } from "../CrudForm-C9xMnPoA.js";
41
- import { n as PaymentReversalForm, r as LoginForm, t as UdpTransactionEmailForm } from "../forms-lyNriVSn.js";
41
+ import { n as PaymentReversalForm, r as LoginForm, t as UdpTransactionEmailForm } from "../forms-sRKithEr.js";
42
42
  import { t as Box } from "../Box-Colr5GEl.js";
43
43
  import { t as Grid } from "../Grid-D1-yWIw5.js";
44
44
  import { t as VirtualForm } from "../VirtualForm-Cw3gjug-.js";
@@ -21,7 +21,7 @@ const UdpFormsSubmissionStatusEnum = Object.freeze({
21
21
  Submitted: 2,
22
22
  Created: 3
23
23
  });
24
- const dateFormatter = (dateString) => {
24
+ const formatDateTime = (dateString) => {
25
25
  let normalizedDateString = dateString;
26
26
  if (dateString.includes(" ")) normalizedDateString = dateString.replace(" ", "T");
27
27
  if (!dateString.toUpperCase().endsWith("Z")) normalizedDateString = normalizedDateString + "Z";
@@ -141,6 +141,48 @@ const mapUrlFiltersToAgGridModel = (filterObjects) => {
141
141
  });
142
142
  return agGridModel;
143
143
  };
144
+ const parseIdAndVersion = (input) => {
145
+ const formSubmissionId = input.replace(/^form-submission-/, "");
146
+ if (formSubmissionId.includes("all-forms-key")) return null;
147
+ return formSubmissionId;
148
+ };
149
+ const getSubmissionStatusLabel = (node) => {
150
+ switch (node?.data?.formSubmission_Status) {
151
+ case UdpFormsSubmissionStatusEnum.InProgress: return "InProgress";
152
+ case UdpFormsSubmissionStatusEnum.Created: return "Created";
153
+ case UdpFormsSubmissionStatusEnum.Submitted: return "Submitted";
154
+ default: return "";
155
+ }
156
+ };
157
+ const getOverdueStatusLabel = (node) => {
158
+ switch (node?.data?.formSubmission_IsOverdue) {
159
+ case true: return "Overdue";
160
+ default: return "";
161
+ }
162
+ };
163
+ const filterSubmissionByTenantId = (submissions, tenantId) => {
164
+ return submissions.filter((submission) => submission.form_TenantId === tenantId);
165
+ };
166
+ const gridFunctions = [
167
+ { name: "agGridSizeColumnsToFit" },
168
+ { name: "agGridAutoSizeColumns" },
169
+ { name: "agGridResetColumns" },
170
+ { name: "agGridHideShowColumns" }
171
+ ];
172
+ const statusMappingConfig = {
173
+ Created: "info",
174
+ InProgress: "warning",
175
+ Submitted: "success",
176
+ Overdue: "error"
177
+ };
178
+ const gridOptions = {
179
+ pagination: true,
180
+ defaultColDef: {
181
+ sortable: true,
182
+ filter: true,
183
+ resizable: true
184
+ }
185
+ };
144
186
  const UdpFormsSubmissionGrid = ({ isManagerMode = false, generic1 = void 0, generic2 = void 0, generic3 = void 0, formsRendererUrlPath = void 0, allFormTitle = void 0, menuTitle = void 0 }) => {
145
187
  const user = useUser();
146
188
  const tenant = useTenant();
@@ -167,10 +209,6 @@ const UdpFormsSubmissionGrid = ({ isManagerMode = false, generic1 = void 0, gene
167
209
  gridApi.onFilterChanged();
168
210
  }
169
211
  }, [gridApi, initialFilterModel]);
170
- const handleSideSheetClosed = () => {
171
- setSelectedUdpFormInSideSheet({});
172
- setIsSidesheetOpen(false);
173
- };
174
212
  const consolidateAndSortFormsByFormId = useCallback((forms, submissions = []) => {
175
213
  const resultMap = /* @__PURE__ */ new Map();
176
214
  for (const item of forms) {
@@ -228,9 +266,6 @@ const UdpFormsSubmissionGrid = ({ isManagerMode = false, generic1 = void 0, gene
228
266
  }
229
267
  return Array.from(resultMap.values()).sort((a, b) => b.mostRecentCreatedOn - a.mostRecentCreatedOn);
230
268
  }, [t]);
231
- const filterSubmissionByTenantId = useCallback((submissions, tenantId) => {
232
- return submissions.filter((submission) => submission.form_TenantId === tenantId);
233
- }, []);
234
269
  useCallback(async () => {
235
270
  try {
236
271
  if (!tenant?.activeTenant?.tenantId) return;
@@ -279,8 +314,7 @@ const UdpFormsSubmissionGrid = ({ isManagerMode = false, generic1 = void 0, gene
279
314
  t,
280
315
  generic1,
281
316
  generic2,
282
- generic3,
283
- filterSubmissionByTenantId
317
+ generic3
284
318
  ]);
285
319
  const fetchForms = useCallback(async () => {
286
320
  try {
@@ -307,11 +341,6 @@ const UdpFormsSubmissionGrid = ({ isManagerMode = false, generic1 = void 0, gene
307
341
  tenant,
308
342
  consolidateAndSortFormSubmissionsByFormId
309
343
  ]);
310
- const parseIdAndVersion = useCallback((input) => {
311
- const formSubmissionId = input.replace(/^form-submission-/, "");
312
- if (formSubmissionId.includes("all-forms-key")) return null;
313
- return formSubmissionId;
314
- }, []);
315
344
  const getSearchMethodConfig = useCallback((formId) => {
316
345
  if (!tenant?.activeTenant?.tenantId) return;
317
346
  const filterElements = [];
@@ -390,38 +419,6 @@ const UdpFormsSubmissionGrid = ({ isManagerMode = false, generic1 = void 0, gene
390
419
  isManagerMode,
391
420
  generateFormRendererUrlPath
392
421
  ]);
393
- const getGridOptions = useCallback(() => {
394
- return {
395
- pagination: true,
396
- defaultColDef: {
397
- sortable: true,
398
- filter: true,
399
- resizable: true
400
- }
401
- };
402
- }, []);
403
- const getStatus = useMemo(() => {
404
- return {
405
- Created: "info",
406
- InProgress: "warning",
407
- Submitted: "success",
408
- Overdue: "error"
409
- };
410
- }, []);
411
- const getSubmissionStatusLabel = (node) => {
412
- switch (node?.data?.formSubmission_Status) {
413
- case UdpFormsSubmissionStatusEnum.InProgress: return "InProgress";
414
- case UdpFormsSubmissionStatusEnum.Created: return "Created";
415
- case UdpFormsSubmissionStatusEnum.Submitted: return "Submitted";
416
- default: return "";
417
- }
418
- };
419
- const getOverdueStatusLabel = (node) => {
420
- switch (node?.data?.formSubmission_IsOverdue) {
421
- case true: return "Overdue";
422
- default: return "";
423
- }
424
- };
425
422
  const columnDefs = useMemo(() => [
426
423
  {
427
424
  headerName: "Form ID",
@@ -459,7 +456,7 @@ const UdpFormsSubmissionGrid = ({ isManagerMode = false, generic1 = void 0, gene
459
456
  field: "formSubmission_Status",
460
457
  cellRenderer: "statusRenderer",
461
458
  cellRendererParams: {
462
- statusMappingConfig: getStatus,
459
+ statusMappingConfig,
463
460
  getStatusValue: getSubmissionStatusLabel
464
461
  }
465
462
  },
@@ -470,35 +467,35 @@ const UdpFormsSubmissionGrid = ({ isManagerMode = false, generic1 = void 0, gene
470
467
  sortable: true,
471
468
  cellRenderer: "statusRenderer",
472
469
  cellRendererParams: {
473
- statusMappingConfig: getStatus,
470
+ statusMappingConfig,
474
471
  getStatusValue: getOverdueStatusLabel
475
472
  }
476
473
  },
477
474
  {
478
475
  headerName: t("Created On"),
479
476
  field: "formSubmission_InitialCreatedOn",
480
- valueFormatter: (p) => p.value ? dateFormatter(p.value) : "",
477
+ valueFormatter: (p) => p.value ? formatDateTime(p.value) : "",
481
478
  sortable: true,
482
479
  cellDataType: "dateTimeString"
483
480
  },
484
481
  {
485
482
  headerName: t("Last Modified On"),
486
483
  field: "formSubmission_LastModifiedOn",
487
- valueFormatter: (p) => p.value ? dateFormatter(p.value) : "",
484
+ valueFormatter: (p) => p.value ? formatDateTime(p.value) : "",
488
485
  sortable: true,
489
486
  cellDataType: "dateTimeString"
490
487
  },
491
488
  {
492
489
  headerName: t("Submitted On"),
493
490
  field: "formSubmission_SubmittedOn",
494
- valueFormatter: (p) => p.value ? dateFormatter(p.value) : "",
491
+ valueFormatter: (p) => p.value ? formatDateTime(p.value) : "",
495
492
  sortable: true,
496
493
  cellDataType: "dateTimeString"
497
494
  },
498
495
  {
499
496
  headerName: t("Due On"),
500
497
  field: "formSubmission_DueDate",
501
- valueFormatter: (p) => p.value ? dateFormatter(p.value) : "",
498
+ valueFormatter: (p) => p.value ? formatDateTime(p.value) : "",
502
499
  sortable: true,
503
500
  cellDataType: "dateTimeString"
504
501
  },
@@ -519,12 +516,6 @@ const UdpFormsSubmissionGrid = ({ isManagerMode = false, generic1 = void 0, gene
519
516
  t,
520
517
  formsRendererUrlPath
521
518
  ]);
522
- const gridFunctions = useMemo(() => [
523
- { name: "agGridSizeColumnsToFit" },
524
- { name: "agGridAutoSizeColumns" },
525
- { name: "agGridResetColumns" },
526
- { name: "agGridHideShowColumns" }
527
- ], []);
528
519
  const handleSidesheetPrimaryClick = useCallback(() => {
529
520
  const [id, versionStr] = (selectedUdpFormInSideSheet.value || "").split("|");
530
521
  const version = Number(versionStr || 0);
@@ -541,6 +532,10 @@ const UdpFormsSubmissionGrid = ({ isManagerMode = false, generic1 = void 0, gene
541
532
  history,
542
533
  generateFormRendererUrlPath
543
534
  ]);
535
+ const handleSideSheetClosed = () => {
536
+ setSelectedUdpFormInSideSheet({});
537
+ setIsSidesheetOpen(false);
538
+ };
544
539
  const selectableItems = useMemo(() => {
545
540
  const map = /* @__PURE__ */ new Map();
546
541
  for (const f of formDataRaw || []) {
@@ -600,7 +595,7 @@ const UdpFormsSubmissionGrid = ({ isManagerMode = false, generic1 = void 0, gene
600
595
  })), /* @__PURE__ */ React.createElement(SearchMethodUdpGrid, {
601
596
  searchMethodConfig: getSearchMethodConfig(formId),
602
597
  columnDefs,
603
- gridOptions: getGridOptions(),
598
+ gridOptions,
604
599
  gridHeaderConfig: getGridHeaderConfig(formId, newestFormVersion, formTitle),
605
600
  gridFunctions,
606
601
  gridApiCallback: handleGridApiCallback
@@ -664,8 +659,7 @@ const UdpFormsSubmissionGrid = ({ isManagerMode = false, generic1 = void 0, gene
664
659
  generic3,
665
660
  isManagerMode,
666
661
  user?.id,
667
- fetchForms,
668
- parseSearchParamsIntoFilterObjects
662
+ fetchForms
669
663
  ]);
670
664
  useEffect(() => {
671
665
  const innerMenuList = consolidateAndSortFormsByFormId(formDataRaw || [], formSubmissionViewDataRaw || []);
@@ -702,4 +696,4 @@ const UdpFormsSubmissionGrid = ({ isManagerMode = false, generic1 = void 0, gene
702
696
 
703
697
  //#endregion
704
698
  export { UdpFormsSubmissionGrid as t };
705
- //# sourceMappingURL=UdpFormsSubmissionGrid-B3pQiK5q.js.map
699
+ //# sourceMappingURL=UdpFormsSubmissionGrid-Qj-ti4hh.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UdpFormsSubmissionGrid-Qj-ti4hh.js","names":["CustomMenuPage"],"sources":["../src/udp/pages/UdpFormsSubmissionGrid/UdpFormsSubmissionGrid.jsx"],"sourcesContent":["import React, { useMemo, useState, useEffect, useCallback, useRef } from 'react';\nimport { useUser } from '../../../utilities/auth/useUser';\nimport { useTenant } from '../../../utilities/tenant/useTenant';\nimport { useHistory, useLocation } from 'react-router-dom';\nimport { useSnackbar } from 'notistack';\nimport { CustomMenuPage } from '../../../menuPage';\nimport { useTranslation } from 'react-i18next';\nimport { apiMutate } from '../../../utilities';\nimport { ConfigService } from '../../../configService';\nimport { SearchMethodUdpGrid } from '../../../UI/templates/newGrid';\nimport { LoadingIndicator } from '../../../UI/loading/LoadingIndicator';\nimport { UdpPageEnums } from '../../../enums';\nimport { StatusCellRenderer } from '../../../UI/templates/ui/renderers';\nimport { SqlFilterOperators } from '../../../enums/aggridEnums';\nimport { SideSheet } from '../../../UI/surfaces/SideSheet';\nimport { Autocomplete } from '@material-ui/lab';\nimport { TextField } from '@material-ui/core';\nimport { PageLoading } from '../../../UI';\nimport { parseSearchParamsIntoFilterObjects } from '../../../utilities/search';\n\n// ============================================================================\n// Submission status enum\n// Used to map numeric submission status values returned from the backend\n// ============================================================================\nconst UdpFormsSubmissionStatusEnum = Object.freeze({\n InProgress: 1,\n Submitted: 2,\n Created: 3\n});\n\n\n// ============================================================================\n// Date formatter helper\n// Normalizes backend date strings and formats them for display\n// Handles both ISO strings and \"YYYY-MM-DD HH:mm:ss.sss\" formats\n// ============================================================================\nconst formatDateTime = (dateString) => {\n let normalizedDateString = dateString;\n\n // Check if the string is in the 'YYYY-MM-DD HH:mm:ss.sss' format\n // (i.e., contains a space instead of 'T').\n // If the input is already ISO (e.g. '2025-12-10T20:23:23.055Z'),\n // it passes straight through.\n // This format is assumed to be missing timezone info and treated as UTC.\n if (dateString.includes(' ')) {\n // Replace the space with 'T' to normalize to ISO-like format\n normalizedDateString = dateString.replace(' ', 'T');\n }\n\n // Ensure UTC timezone is explicitly specified\n if (!dateString.toUpperCase().endsWith('Z')) {\n normalizedDateString = normalizedDateString + 'Z';\n }\n\n const date = new Date(normalizedDateString);\n\n // Localized, user-friendly date/time display\n return date.toLocaleString(undefined, {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n hour12: true\n });\n};\n\n// ============================================================================\n// URL filter field → ag-Grid filter configuration mapping\n// Used when converting URL search params into ag-Grid filter models\n// ============================================================================\nconst filterConfigByUrlField = {\n form_name: { agGridField: 'form_Name', filterType: 'text' },\n formsubmission_formversion: {\n agGridField: 'formSubmission_FormVersion',\n filterType: 'number'\n },\n form_description: { agGridField: 'form_Description', filterType: 'text' },\n formsubmission_userdisplayname: {\n agGridField: 'formSubmission_UserDisplayName',\n filterType: 'text'\n },\n formsubmission_status: {\n agGridField: 'formSubmission_Status',\n filterType: 'number'\n },\n formsubmission_initialcreatedon: {\n agGridField: 'formSubmission_InitialCreatedOn',\n filterType: 'date'\n },\n formsubmission_lastmodifiedon: {\n agGridField: 'formSubmission_LastModifiedOn',\n filterType: 'date'\n },\n formsubmission_submittedon: {\n agGridField: 'formSubmission_SubmittedOn',\n filterType: 'date'\n },\n formsubmission_duedate: {\n agGridField: 'formSubmission_DueDate',\n filterType: 'date'\n },\n formsubmission_isoverdue: {\n agGridField: 'formSubmission_IsOverdue',\n filterType: 'text'\n }\n};\n\n\n/**\n * Maps your internal filter object structure (from URL processing)\n * to the ag-Grid Filter Model structure.\n * * @param {Array<{searchField: string, searchOperator: number, searchValue: string}>} filterObjects\n * @returns {object} ag-Grid Filter Model\n */\n/**\n * Maps your internal filter object structure (from URL processing)\n * to the ag-Grid Filter Model structure.\n * @param {Array<{searchField: string, searchOperator: number, searchValue: string}>} filterObjects\n * @returns {object} ag-Grid Filter Model\n */\nconst mapUrlFiltersToAgGridModel = (filterObjects) => {\n if (!filterObjects || filterObjects.length === 0) {\n return null;\n }\n\n const agGridModel = {};\n\n filterObjects.forEach((filter) => {\n const { searchField, searchOperator, searchValue } = filter;\n\n const searchKey = searchField.toLocaleLowerCase();\n const config = filterConfigByUrlField[searchKey];\n\n if (!config) {\n console.warn(\n `No configuration found for URL filter field: ${searchField}. Filter ignored.`\n );\n return;\n }\n\n const agGridField = config.agGridField;\n const filterType = config.filterType;\n\n let type = 'equals';\n switch (searchOperator) {\n case SqlFilterOperators.EQUALS:\n type = 'equals';\n break;\n case SqlFilterOperators.NOT_EQUALS:\n type = 'notEqual';\n break;\n case SqlFilterOperators.GREATER_THAN:\n type = 'greaterThan';\n break;\n case SqlFilterOperators.LESS_THAN:\n type = 'lessThan';\n break;\n case SqlFilterOperators.LIKE:\n type = 'contains';\n break;\n default:\n type = 'equals';\n }\n\n let filterValue = searchValue;\n\n if (\n !filterValue ||\n filterValue.toLowerCase() === 'undefined' ||\n filterValue.toLowerCase() === 'null'\n ) {\n console.warn(\n `Skipping filter for ${agGridField} due to invalid value: ${searchValue}`\n );\n return;\n }\n\n if (filterType == 'date'){\n agGridModel[agGridField] = {\n filterType,\n type,\n dateFrom: filterValue\n };\n } else if (filterType == 'text' && agGridField.toLocaleLowerCase() == 'formsubmission_isoverdue') {\n agGridModel[agGridField] = {\n filterType,\n type: filterValue,\n };\n } else {\n agGridModel[agGridField] = {\n filterType,\n type,\n filter: filterValue\n };\n }\n\n });\n\n return agGridModel;\n};\n\n\n// ============================================================================\n// Helper for CustomMenuPage to parse form submission ID and version from node ID\n// ============================================================================\nconst parseIdAndVersion = (input) => {\n const formSubmissionId = input.replace(/^form-submission-/, '');\n // Check for \"all forms\" special case\n if (formSubmissionId.includes('all-forms-key')) {\n return null;\n }\n return formSubmissionId;\n};\n\n\n// ============================================================================\n// Maps a submission status enum value to a human-readable status label\n// Used in grid cell renderer\n// ============================================================================\nconst getSubmissionStatusLabel = (node) => {\n const formStatus = node?.data?.formSubmission_Status;\n switch (formStatus) {\n case UdpFormsSubmissionStatusEnum.InProgress:\n return 'InProgress';\n case UdpFormsSubmissionStatusEnum.Created:\n return 'Created';\n case UdpFormsSubmissionStatusEnum.Submitted:\n return 'Submitted';\n default:\n return '';\n }\n};\n\n// ============================================================================\n// Maps overdue flag to a display label\n// Used in grid cell renderer\n// ============================================================================\nconst getOverdueStatusLabel = (node) => {\n const overdueStatus = node?.data?.formSubmission_IsOverdue;\n switch (overdueStatus) {\n case true:\n return 'Overdue';\n default:\n return '';\n }\n};\n\n// ============================================================================\n// Filters form submissions by tenant ID\n// ============================================================================\nconst filterSubmissionByTenantId = (submissions, tenantId) => {\n return submissions.filter(\n (submission) => submission.form_TenantId === tenantId\n );\n}\n\n\n// ============================================================================\n// Map of status labels to status types\n// Used in grid configs\n// ============================================================================\nconst gridFunctions = [\n { name: 'agGridSizeColumnsToFit' },\n { name: 'agGridAutoSizeColumns' },\n { name: 'agGridResetColumns' },\n { name: 'agGridHideShowColumns' }\n]\n\n// ============================================================================\n// Map of status labels to status types\n// Used in grid configs\n// ============================================================================\nconst statusMappingConfig = {\n Created: 'info',\n InProgress: 'warning',\n Submitted: 'success',\n Overdue: 'error'\n};\n\n// ============================================================================\n// Map of status labels to status types\n// Grid options config\n// ============================================================================\nconst gridOptions = {\n pagination: true,\n defaultColDef: {\n sortable: true,\n filter: true,\n resizable: true\n }\n}\n\nexport const UdpFormsSubmissionGrid = ({\n isManagerMode = false,\n generic1 = undefined,\n generic2 = undefined,\n generic3 = undefined,\n formsRendererUrlPath = undefined,\n allFormTitle = undefined,\n menuTitle = undefined,\n}) => {\n const user = useUser();\n const tenant = useTenant();\n const history = useHistory();\n const location = useLocation();\n const { t } = useTranslation();\n const { enqueueSnackbar, closeSnackbar } = useSnackbar();\n\n // Component states\n const [innerMenuItemList, setInnerMenuItemList] = useState([]);\n const [formSubmissionViewDataRaw, setFormSubmissionViewDataRaw] = useState([]);\n const [formDataRaw, setFormDataRaw] = useState([]);\n const [isSidesheetOpen, setIsSidesheetOpen] = useState(false);\n const [selectedUdpFormInSideSheet, setSelectedUdpFormInSideSheet] = useState({});\n const [formSubmissionUrlSearchObjs, setFormSubmissionUrlSearchObjs] = useState([]);\n const [gridApi, setGridApi] = useState(null); \n const handleGridApiCallback = useCallback((api) => {setGridApi(api); }, []);\n\n const initialFilterModel = useMemo(() => {\n return mapUrlFiltersToAgGridModel(formSubmissionUrlSearchObjs);\n }, [formSubmissionUrlSearchObjs]);\n\n useEffect(() => {\n if (gridApi && initialFilterModel) {\n gridApi.setFilterModel(initialFilterModel);\n gridApi.onFilterChanged();\n }\n }, [gridApi, initialFilterModel]);\n\n\n const consolidateAndSortFormsByFormId = useCallback(\n (forms, submissions = []) => {\n const resultMap = new Map();\n for (const item of forms) {\n const {\n id: formId,\n version: formVersion,\n name: formName,\n description: formDescription,\n initialCreatedOn: initialCreatedOn\n } = item;\n if (!formId || formVersion == null) continue;\n\n const key = String(formId);\n const existing = resultMap.get(key);\n\n // normalize version and timestamp\n const versionNum = Number(formVersion) || 0;\n const ts = initialCreatedOn ? new Date(initialCreatedOn).getTime() : 0;\n\n // robust comparison (coerce to string)\n const submissionCount = (submissions || []).filter(\n (sub) => String(sub?.formSubmission_FormId) === key\n ).length;\n\n if (!existing) {\n resultMap.set(key, {\n id: key,\n formId,\n formVersion: versionNum,\n name: formName || t('Untitled Form'),\n submissionCount,\n description: formDescription || '',\n mostRecentCreatedOn: ts\n });\n } else {\n // keep metadata (name/description/formVersion) from the highest version seen\n if (versionNum > (existing.formVersion || 0)) {\n existing.formVersion = versionNum;\n if (formName) existing.name = formName;\n if (formDescription) existing.description = formDescription;\n }\n }\n }\n\n const sortedOptions = Array.from(resultMap.values()).sort((a, b) =>\n b.name.localeCompare(a.name)\n );\n return sortedOptions;\n },\n [t]\n );\n\n const consolidateAndSortFormSubmissionsByFormId = useCallback(\n (submissions) => {\n const resultMap = new Map();\n for (const item of submissions) {\n const {\n formSubmission_FormId: formId,\n formSubmission_FormVersion: formVersion,\n form_Name: formName,\n form_Description: formDescription,\n formSubmission_InitialCreatedOn: initialCreatedOn\n } = item;\n if (!formId || formVersion == null) continue;\n\n const key = `${formId}`;\n const existing = resultMap.get(key);\n\n // normalize version and timestamp\n const versionNum = Number(formVersion) || 0;\n const ts = initialCreatedOn ? new Date(initialCreatedOn).getTime() : 0;\n\n if (!existing) {\n resultMap.set(key, {\n id: key,\n formId,\n formVersion: versionNum,\n name: formName || t('Untitled Form'),\n submissionCount: 1,\n description: formDescription || '',\n mostRecentCreatedOn: ts\n });\n } else {\n existing.submissionCount += 1;\n existing.mostRecentCreatedOn = Math.max(\n existing.mostRecentCreatedOn || 0,\n ts\n );\n\n // keep metadata (name/description/formVersion) from the highest version seen\n if (versionNum > (existing.formVersion || 0)) {\n existing.formVersion = versionNum;\n if (formName) existing.name = formName;\n if (formDescription) existing.description = formDescription;\n }\n }\n }\n\n const sortedOptions = Array.from(resultMap.values()).sort(\n (a, b) => b.mostRecentCreatedOn - a.mostRecentCreatedOn\n );\n return sortedOptions;\n },\n [t]\n );\n\n const fetchSubmissions = useCallback(async () => {\n try {\n if (!tenant?.activeTenant?.tenantId) return;\n\n const filterElements = [];\n\n filterElements.push({\n searchField: 'Form_TenantId',\n searchOperator: '=',\n searchValue: tenant.activeTenant.tenantId\n });\n\n if (!isManagerMode) {\n filterElements.push({\n searchField: 'FormSubmission_UnityUserId',\n searchOperator: '=',\n searchValue: user.id\n });\n }\n\n if (generic1 !== undefined) {\n filterElements.push({\n searchField: 'formSubmission_generic1',\n searchOperator: '=',\n searchValue: generic1\n });\n }\n\n if (generic2 !== undefined) {\n filterElements.push({\n searchField: 'formSubmission_generic2',\n searchOperator: '=',\n searchValue: generic2\n });\n }\n\n if (generic3 !== undefined) {\n filterElements.push({\n searchField: 'formSubmission_generic3',\n searchOperator: '=',\n searchValue: generic3\n });\n }\n\n const formSubmissionViewSearchResponse = await apiMutate(\n ConfigService.productV1ApiUrl,\n `UdpFormWithSubmissionsView/search`,\n {\n method: 'POST',\n data: {\n eagerLoad: false,\n getAll: true,\n filterElements\n }\n },\n {}\n );\n\n const submissions = formSubmissionViewSearchResponse?.data.pageList || [];\n const processedSubmissions = filterSubmissionByTenantId(\n submissions,\n tenant.activeTenant.tenantId\n );\n setFormSubmissionViewDataRaw(processedSubmissions);\n } catch (e) {\n console.error('fetchSubmissions error:', e);\n }\n }, [\n user,\n tenant,\n isManagerMode,\n consolidateAndSortFormSubmissionsByFormId,\n t,\n generic1,\n generic2,\n generic3,\n ]);\n\n const fetchForms = useCallback(async () => {\n try {\n if (!tenant?.activeTenant?.tenantId) return;\n\n const filterElements = [];\n\n filterElements.push({\n searchField: 'tenantId',\n searchOperator: '=',\n searchValue: tenant.activeTenant.tenantId\n });\n\n const formResponse = await apiMutate(\n ConfigService.productV1ApiUrl,\n `UdpForm/search`,\n {\n method: 'POST',\n data: {\n eagerLoad: false,\n getAll: true,\n filterElements\n }\n },\n {}\n );\n\n const forms = formResponse?.data.pageList || [];\n setFormDataRaw(forms);\n } catch (e) {\n console.error('fetchForms error:', e);\n }\n }, [user, tenant, consolidateAndSortFormSubmissionsByFormId]);\n\n\n const getSearchMethodConfig = useCallback(\n (formId) => {\n if (!tenant?.activeTenant?.tenantId) return;\n\n const filterElements = [];\n\n if (!isManagerMode) {\n filterElements.push({\n searchField: 'formSubmission_unityUserId',\n searchOperator: '=',\n searchValue: user.id || ''\n });\n }\n\n if (formId) {\n filterElements.push({\n searchField: 'formSubmission_formId',\n searchOperator: '=',\n searchValue: formId\n });\n }\n\n if (generic1 !== undefined) {\n filterElements.push({\n searchField: 'formSubmission_generic1',\n searchOperator: '=',\n searchValue: generic1\n });\n }\n\n if (generic2 !== undefined) {\n filterElements.push({\n searchField: 'formSubmission_generic2',\n searchOperator: '=',\n searchValue: generic2\n });\n }\n\n if (generic3 !== undefined) {\n filterElements.push({\n searchField: 'formSubmission_generic3',\n searchOperator: '=',\n searchValue: generic3\n });\n }\n\n filterElements.push({\n searchField: 'form_tenantId',\n searchOperator: '=',\n searchValue: tenant?.activeTenant?.tenantId || ''\n });\n\n return {\n requestUrl: `${ConfigService.productV1ApiUrl}/UdpFormWithSubmissionsView/search`,\n customSearchObject: {\n eagerLoad: false,\n filterElements,\n orderElements: [\n {\n sortColumn: 'initialCreatedOn',\n sortDirection: 'DESC'\n }\n ]\n }\n // logicalSearchOperator: 1,\n // groupingType: '',\n // groupProperty: [],\n // groupOperationList: [],\n // type: 'advanced',\n // pageNumber: 1,\n // pageSize: 20,\n };\n },\n [user, isManagerMode, tenant, generic1, generic2, generic3]\n );\n\n const generateFormRendererUrlPath = useCallback(\n (formId, formVersion) => {\n const baseRoute = formsRendererUrlPath\n ? formsRendererUrlPath\n : 'page/' + UdpPageEnums.Udp_Form_Renderer_Page;\n\n return `${baseRoute}?udpf_formId=${encodeURIComponent(\n formId\n )}&udpf_version=${encodeURIComponent(formVersion)}`;\n },\n [generic1, generic2, generic3, formsRendererUrlPath]\n );\n\n const getGridHeaderConfig = useCallback(\n (formId, formVersion, formTitle) => {\n const config = {\n title: formTitle\n };\n\n if (!isManagerMode) {\n config.primaryActionButton = {\n label: t('Submit New Form'),\n onClick: () => {\n // Only show submit button when we have a specific form id and version\n if (formId && formVersion) {\n const urlPath = generateFormRendererUrlPath(formId, formVersion);\n history.push(urlPath);\n } else {\n setIsSidesheetOpen(true);\n }\n }\n };\n }\n\n return config;\n },\n [history, t, isManagerMode, generateFormRendererUrlPath]\n );\n\n\n\n const columnDefs = useMemo(\n () => [\n { headerName: 'Form ID', field: 'formSubmission_FormId', hide: true },\n {\n headerName: t('Name'),\n field: 'form_Name',\n type: 'text',\n sortable: true\n },\n {\n headerName: t('Version'),\n field: 'formSubmission_FormVersion',\n type: 'number',\n sortable: true\n },\n {\n headerName: t('Description'),\n field: 'form_Description',\n type: 'text',\n sortable: true,\n hide: true\n },\n {\n headerName: t('Submitted By'),\n field: 'formSubmission_UserDisplayName',\n type: 'text',\n sortable: true\n },\n {\n headerName: t('Status'),\n filter: true,\n field: 'formSubmission_Status',\n cellRenderer: 'statusRenderer',\n cellRendererParams: {\n statusMappingConfig: statusMappingConfig,\n getStatusValue: getSubmissionStatusLabel\n }\n },\n {\n headerName: t('Overdue Status'),\n field: 'formSubmission_IsOverdue',\n cellDataType : \"boolean\",\n sortable: true,\n cellRenderer: 'statusRenderer',\n cellRendererParams: {\n statusMappingConfig: statusMappingConfig,\n getStatusValue: getOverdueStatusLabel\n }\n },\n {\n headerName: t('Created On'),\n field: 'formSubmission_InitialCreatedOn',\n valueFormatter: (p) => (p.value ? formatDateTime(p.value) : ''),\n sortable: true,\n cellDataType: 'dateTimeString'\n },\n {\n headerName: t('Last Modified On'),\n field: 'formSubmission_LastModifiedOn',\n valueFormatter: (p) => (p.value ? formatDateTime(p.value) : ''),\n sortable: true,\n cellDataType: 'dateTimeString'\n },\n {\n headerName: t('Submitted On'),\n field: 'formSubmission_SubmittedOn',\n valueFormatter: (p) => (p.value ? formatDateTime(p.value) : ''),\n sortable: true,\n cellDataType: 'dateTimeString'\n },\n {\n headerName: t('Due On'),\n field: 'formSubmission_DueDate',\n valueFormatter: (p) => (p.value ? formatDateTime(p.value) : ''),\n sortable: true,\n cellDataType: 'dateTimeString'\n },\n {\n field: 'actions',\n cellRenderer: 'actionsRenderer',\n cellRendererParams: {\n actionList: [\n {\n id: 0,\n iconName: 'view',\n title: t('Open This Submission'),\n handleOnClick: (e, params) => {\n history.push(\n `${\n formsRendererUrlPath\n ? formsRendererUrlPath\n : '/page/' + UdpPageEnums.Udp_Form_Renderer_Page\n }?udpf_submissionId=${params?.data?.formSubmission_Id}`\n );\n }\n }\n ]\n }\n }\n ],\n [history, t, formsRendererUrlPath]\n );\n\n\n // ============================================================================\n // Side Sheet Helpers and Handlers\n // ============================================================================\n const handleSidesheetPrimaryClick = useCallback(() => {\n // selectedUdpFormInSideSheet format is \"formId|formVersion\"\n const raw = selectedUdpFormInSideSheet.value || '';\n const [id, versionStr] = raw.split('|');\n const version = Number(versionStr || 0);\n if (!id || !version) {\n console.warn('Invalid selection:', selectedUdpFormInSideSheet);\n setIsSidesheetOpen(false);\n return;\n }\n\n setIsSidesheetOpen(false);\n const urlPath = generateFormRendererUrlPath(id, version);\n history.push(urlPath);\n }, [selectedUdpFormInSideSheet, history, generateFormRendererUrlPath]);\n\n \n const handleSideSheetClosed = () => {\n setSelectedUdpFormInSideSheet({});\n setIsSidesheetOpen(false);\n };\n\n const selectableItems = useMemo(() => {\n const map = new Map();\n\n for (const f of formDataRaw || []) {\n const formType = f.form_Type ?? f.formType ?? f.type;\n if (Number(formType) !== 1) continue;\n\n const formId = f.id ?? f.form_Id ?? f.formId ?? String(f?.Id ?? '');\n const version = Number(f.version ?? f.form_Version ?? f.formVersion ?? 0);\n const name =\n f.name ??\n f.form_Name ??\n f.formName ??\n f.Form_Name ??\n f.displayName ??\n t('Untitled Form');\n const description = f.description ?? f.form_Description ?? '';\n\n const existing = map.get(formId);\n if (!existing || version > existing.version) {\n map.set(formId, { id: formId, name, version, description });\n }\n }\n\n return Array.from(map.values()).sort((a, b) => b.version - a.version);\n }, [formDataRaw, t]);\n\n const selectorOptions = useMemo(() => {\n return (selectableItems || []).map((s) => ({\n value: `${s.id}|${s.version}`,\n label: s.version ? `${s.name} (v${s.version})` : s.name\n }));\n }, [selectableItems]);\n\n const handleSelectedUdpFormInSideSheetChange = (event, newValue) => {\n if (newValue !== null) {\n setSelectedUdpFormInSideSheet(newValue);\n }\n };\n\n const getMainGridContent = ({\n selectedNode,\n menuItemsList,\n idMap,\n classes\n }) => {\n if (!selectedNode) {\n return <PageLoading />;\n }\n const formId = parseIdAndVersion(selectedNode.id);\n const found = innerMenuItemList.find((form) => form.formId == formId);\n const formTitle = `${found?.name}` || 'Unknown Form';\n const newestFormVersion = formDataRaw\n .filter((formObj) => formObj.id == formId)\n .reduce((acc, curr) => {\n return Math.max(acc, curr.version);\n }, 0);\n\n return (\n <>\n <SideSheet\n open={isSidesheetOpen}\n title={t('Submit New Form')}\n position='right'\n width={'30%'}\n buttonLabel={t('New')}\n buttonOneDisabled={!selectedUdpFormInSideSheet.value}\n onSubmit={handleSidesheetPrimaryClick}\n onClose={handleSideSheetClosed}\n >\n <Autocomplete\n options={selectorOptions}\n getOptionLabel={(selectedOption) => selectedOption.label}\n onChange={handleSelectedUdpFormInSideSheetChange}\n value={selectedUdpFormInSideSheet.value}\n disableClearable={true}\n size='small'\n renderInput={(params) => (\n <TextField {...params} label='Choose a Form' variant='outlined' />\n )}\n />\n </SideSheet>\n <SearchMethodUdpGrid\n searchMethodConfig={getSearchMethodConfig(formId)}\n columnDefs={columnDefs}\n gridOptions={gridOptions}\n gridHeaderConfig={getGridHeaderConfig(\n formId,\n newestFormVersion,\n formTitle\n )}\n gridFunctions={gridFunctions}\n gridApiCallback={handleGridApiCallback} // Pass the setter/ref handler\n />\n </>\n );\n };\n\n useEffect(() => {\n if (!tenant?.activeTenant?.tenantId) return;\n\n const urlSearchObjs = parseSearchParamsIntoFilterObjects();\n setFormSubmissionUrlSearchObjs(urlSearchObjs); // THIS LINE TRIGGERS initialFilterModel\n\n let cancelled = false;\n (async () => {\n try {\n // replicate fetchSubmissions logic but using local urlSearchObjs (avoids depending on the state)\n let filterElements = [];\n\n filterElements.push({\n searchField: 'Form_TenantId',\n searchOperator: '=',\n searchValue: tenant.activeTenant.tenantId\n });\n\n if (!isManagerMode) {\n filterElements.push({\n searchField: 'FormSubmission_UnityUserId',\n searchOperator: '=',\n searchValue: user.id\n });\n }\n\n if (generic1 !== undefined) {\n filterElements.push({\n searchField: 'formSubmission_generic1',\n searchOperator: '=',\n searchValue: generic1\n });\n }\n\n if (generic2 !== undefined) {\n filterElements.push({\n searchField: 'formSubmission_generic2',\n searchOperator: '=',\n searchValue: generic2\n });\n }\n\n if (generic3 !== undefined) {\n filterElements.push({\n searchField: 'formSubmission_generic3',\n searchOperator: '=',\n searchValue: generic3\n });\n }\n\n const formSubmissionViewSearchResponse = await apiMutate(\n ConfigService.productV1ApiUrl,\n `UdpFormWithSubmissionsView/search`,\n {\n method: 'POST',\n data: {\n eagerLoad: false,\n getAll: true,\n filterElements\n }\n },\n {}\n );\n\n if (cancelled) return;\n\n const submissions = formSubmissionViewSearchResponse?.data.pageList || [];\n const processedSubmissions = submissions.filter((submission) =>\n submission.form_TenantId === tenant.activeTenant.tenantId\n );\n setFormSubmissionViewDataRaw(processedSubmissions);\n await fetchForms();\n } catch (err) {\n console.error('fetching submissions/forms failed', err);\n }\n })();\n\n return () => {\n cancelled = true;\n };\n }, [\n location.search,\n tenant?.activeTenant?.tenantId,\n generic1,\n generic2,\n generic3,\n isManagerMode,\n user?.id,\n fetchForms\n ]);\n\n // derive menu items from fetched submissions (separate effect to avoid refetch loop)\n useEffect(() => {\n const innerMenuList = consolidateAndSortFormsByFormId(\n formDataRaw || [],\n formSubmissionViewDataRaw || []\n );\n\n innerMenuList.unshift({\n id: 'all-forms-key',\n name: allFormTitle ?? t(\n isManagerMode ? t('All Form Submissions') : t('All My Form Submissions')\n ),\n submissionCount: formSubmissionViewDataRaw?.length || 0\n });\n setInnerMenuItemList(innerMenuList);\n }, [\n formSubmissionViewDataRaw,\n isManagerMode,\n consolidateAndSortFormsByFormId,\n formDataRaw,\n t,\n allFormTitle]);\n\n return (\n <div>\n <CustomMenuPage\n menuTitle={menuTitle ?? t('Forms')}\n items={innerMenuItemList}\n idPrefix='form-submission'\n showItemCount={true}\n itemCountAccessor={(item) => item?.submissionCount ?? 0}\n mainContent={({ selectedNode, menuItemsList, idMap, classes }) => {\n return (\n <div>\n {getMainGridContent({\n selectedNode,\n menuItemsList,\n idMap,\n classes\n })}\n </div>\n );\n }}\n />\n </div>\n );\n};\n"],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  import { t as __exportAll } from "./chunk-BN_g-Awi.js";
2
2
  import { t as Form } from "./Form-DbOA5j38.js";
3
3
  import { t as Field } from "./Field-Cda5rJe2.js";
4
+ import { a as FormSpy } from "./form-Dj1zVw6K.js";
4
5
  import { t as FluentButton } from "./FluentButton-BexKrnAp.js";
5
6
  import { t as ConfigService$1 } from "./configService-C4uoG3wj.js";
6
7
  import { i as useHandleAxiosSnackbar } from "./apiHelpers-WIR8pqy0.js";
@@ -40,12 +41,14 @@ import { t as Attachments } from "./uploader-BdeUKdYW.js";
40
41
  import React, { forwardRef, useCallback, useEffect, useImperativeHandle, useMemo, useRef, useState } from "react";
41
42
  import { CircularProgress, FormControlLabel, LinearProgress, Switch, makeStyles } from "@material-ui/core";
42
43
  import { useSnackbar } from "notistack";
44
+ import { useLocation } from "react-router-dom";
43
45
  import { AddIcon, ContactIcon, DocumentIcon, FileImageIcon, PDFIcon, ViewIcon, WordDocumentIcon } from "@fluentui/react-icons";
44
46
  import { useTranslation } from "react-i18next";
45
47
  import { create } from "zustand";
46
48
  import { devtools } from "zustand/middleware";
47
49
  import jsonLogic from "json-logic-js";
48
50
  import { ConfigService, UdpAttachmentItem, UdpTimelineConnector, UdpTimelineDot, UdpTimelineItem, UdpTimelineSeparator } from "udp-react-stencil-component-library";
51
+ import "date-fns";
49
52
  import "./udp/pages/UdpTransactionsPage/sidesheets/WorkflowActions.css";
50
53
  import "./udp/pages/UdpTransactionsPage/sidesheets/EditTransaction.css";
51
54
  import "./udp/pages/UdpTransactionsPage/components/EditTransactionDetailsFooterItem.css";
@@ -175,7 +178,7 @@ const useTransactionEngine = (transactionTypeId) => {
175
178
  //#endregion
176
179
  //#region src/udp/pages/UdpTransactionsPage/UdpTransactionGrid.jsx
177
180
  const UdpTransactionGrid = (props) => {
178
- const { transactionTypeId, domainName, transactionTypeLoading, handleGridApiCallback, openAddTransaction, openViewTransaction, openEditTransaction, openAttachmentTransaction, openWorkflowActionTransaction, openCreateRevision, searchMethodObject, domainColumnFormatters = {}, refreshGridData, gridApi, initialFilterModel } = props;
181
+ const { transactionTypeId, domainName, transactionTypeLoading, handleGridApiCallback, openAddTransaction, openViewTransaction, openEditTransaction, openAttachmentTransaction, openWorkflowActionTransaction, openCreateRevision, searchMethodObject, domainColumnFormatters = {}, refreshGridData, gridApi, initialFilterModel, initialGridOptions = {} } = props;
179
182
  const [dialogOpen, setDialogOpen] = useState(false);
180
183
  const [selectedTransaction, setSelectedTransaction] = useState(null);
181
184
  const { t } = useTranslation();
@@ -382,9 +385,10 @@ const UdpTransactionGrid = (props) => {
382
385
  const gridOptions = useMemo(() => {
383
386
  return {
384
387
  pagination: true,
385
- rowSelection: "none"
388
+ rowSelection: "none",
389
+ ...initialGridOptions
386
390
  };
387
- }, []);
391
+ }, [initialGridOptions]);
388
392
  const searchMethodConfig = useMemo(() => {
389
393
  let combinedSearchObject = {
390
394
  eagerLoad: true,
@@ -420,6 +424,7 @@ const UdpTransactionGrid = (props) => {
420
424
  gridApi.onFilterChanged();
421
425
  }
422
426
  }, [gridApi, initialFilterModel]);
427
+ console.log(gridApi?.getFilterModel());
423
428
  return /* @__PURE__ */ React.createElement(React.Fragment, null, transactionTypeLoading && /* @__PURE__ */ React.createElement(LinearProgress$1, null), /* @__PURE__ */ React.createElement(SearchMethodUdpGrid, {
424
429
  gridHeaderConfig: headerConfig,
425
430
  gridFunctions,
@@ -624,7 +629,7 @@ var AttachmentTransaction_default = AttachmentTransaction;
624
629
  //#endregion
625
630
  //#region src/udp/pages/UdpTransactionsPage/components/UdpTransactionCustomPage.jsx
626
631
  const UdpTransactionCustomPage = (props) => {
627
- const { pageId, transactionTypeId, transactionUiActionType, formRef, transaction, transactionTypeTransactionActionId } = props;
632
+ const { pageId, transactionTypeId, transactionUiActionType, formRef, transaction, transactionTypeTransactionActionId, setHasUnsavedChanges } = props;
628
633
  const { getUiActionRenderPageId, getHiddenFields, getRequiredFields } = useTransactionEngine(transactionTypeId);
629
634
  const { handleErrorSnackbar, handleSuccessSnackbar } = useHandleAxiosSnackbar();
630
635
  const { t } = useTranslation();
@@ -659,6 +664,11 @@ const UdpTransactionCustomPage = (props) => {
659
664
  else handleErrorSnackbar(new Error(t(`Error ${errorMessagePart} Transaction. Please try again later.`)));
660
665
  } catch (error) {
661
666
  handleErrorSnackbar(error);
667
+ } finally {
668
+ if (setHasUnsavedChanges) {
669
+ formRef.current?.form?.restart(values);
670
+ setHasUnsavedChanges(false);
671
+ }
662
672
  }
663
673
  }, [
664
674
  executeCreateTransactionAction,
@@ -669,7 +679,9 @@ const UdpTransactionCustomPage = (props) => {
669
679
  transactionUiActionType,
670
680
  executeSubmitCustomAction,
671
681
  t,
672
- transactionTypeTransactionActionId
682
+ transactionTypeTransactionActionId,
683
+ setHasUnsavedChanges,
684
+ formRef
673
685
  ]);
674
686
  const isFieldRequired = useCallback((fieldName) => {
675
687
  return getRequiredFields(transaction)?.includes(fieldName);
@@ -689,7 +701,9 @@ const UdpTransactionCustomPage = (props) => {
689
701
  return /* @__PURE__ */ React.createElement(Form, {
690
702
  onSubmit,
691
703
  ref: formRef
692
- }, /* @__PURE__ */ React.createElement(PageContainer, {
704
+ }, /* @__PURE__ */ React.createElement(FormSpy, { subscription: { dirty: true } }, ({ dirty }) => {
705
+ if (setHasUnsavedChanges) setHasUnsavedChanges(dirty);
706
+ }), /* @__PURE__ */ React.createElement(PageContainer, {
693
707
  pageId: transactionPageId,
694
708
  updateLocationState: false,
695
709
  widgetParams: {
@@ -1442,7 +1456,7 @@ var EditTransactionDetailsForm_default = EditTransactionDetailsForm;
1442
1456
  //#endregion
1443
1457
  //#region src/udp/pages/UdpTransactionsPage/sidesheets/EditTransaction.jsx
1444
1458
  const EditTransaction = (props) => {
1445
- const { transaction: initialTransaction, transactionTypeId, transactionIsClosed, openInnerSidesheetState, setOpenInnerSidesheetState, refreshGridData, closeSideSheet, setSidesheetLoading } = props;
1459
+ const { transaction: initialTransaction, transactionTypeId, transactionIsClosed, openInnerSidesheetState, setOpenInnerSidesheetState, refreshGridData, closeSideSheet, setSidesheetLoading, setHasUnsavedChanges } = props;
1446
1460
  const { t } = useTranslation();
1447
1461
  const [selectedTab, setSelectedTab] = useState(0);
1448
1462
  const [transaction, setTransaction] = useState(initialTransaction);
@@ -1723,7 +1737,8 @@ const EditTransaction = (props) => {
1723
1737
  transactionTypeId,
1724
1738
  transactionUiActionType: TransactionUiActionTypeEnums.Render_Transaction_Details_Page,
1725
1739
  formRef,
1726
- transaction
1740
+ transaction,
1741
+ setHasUnsavedChanges
1727
1742
  }) : /* @__PURE__ */ React.createElement(EditTransactionDetailsForm_default, {
1728
1743
  transaction,
1729
1744
  formRef
@@ -1780,6 +1795,8 @@ const UdpTransactionSidesheet = (props) => {
1780
1795
  notes: false
1781
1796
  });
1782
1797
  const [dialogOpen, setDialogOpen] = useState(false);
1798
+ const [unsavedChangesDialogOpen, setUnsavedChangesDialogOpen] = useState(false);
1799
+ const [hasUnsavedChanges, setHasUnsavedChanges] = useState(false);
1783
1800
  const { handleSuccessSnackbar, handleErrorSnackbar } = useHandleAxiosSnackbar();
1784
1801
  const { hasClosedStatus, checkIfTransactionIsClosed, getTransactionTypeLabel, getUiActionRenderPageId } = useTransactionEngine(transactionTypeId);
1785
1802
  const { t } = useTranslation();
@@ -1790,6 +1807,9 @@ const UdpTransactionSidesheet = (props) => {
1790
1807
  const handleDialogClose = () => {
1791
1808
  setDialogOpen(false);
1792
1809
  };
1810
+ const handleUnsavedChangesDialogClose = () => {
1811
+ setUnsavedChangesDialogOpen(false);
1812
+ };
1793
1813
  const executeCloseTransaction = useCallback(async () => {
1794
1814
  if ((await apiMutate(ConfigService$1.productV1ApiUrl, `udpTransaction/${transaction?.transactionId}/closeTransaction`, { method: "post" }))?.status === 200) {
1795
1815
  handleSidesheet("edit", false);
@@ -1829,7 +1849,7 @@ const UdpTransactionSidesheet = (props) => {
1829
1849
  ]);
1830
1850
  const handleCreateRevision = useCallback(async () => {
1831
1851
  setSidesheetLoading(true);
1832
- formRef.current?.form?.submit();
1852
+ await formRef.current?.form?.submit();
1833
1853
  setSidesheetLoading(false);
1834
1854
  handleSidesheet("createRevision", false);
1835
1855
  refreshGridData();
@@ -1838,6 +1858,14 @@ const UdpTransactionSidesheet = (props) => {
1838
1858
  refreshGridData,
1839
1859
  formRef
1840
1860
  ]);
1861
+ const handleNextStepsAction = useCallback(() => {
1862
+ if (!hasUnsavedChanges) setEditTransactionOpenInnerSidesheetState({ workflowAction: true });
1863
+ else setUnsavedChangesDialogOpen(true);
1864
+ }, [hasUnsavedChanges]);
1865
+ const handleConfirmUnsavedChangesDialog = useCallback(() => {
1866
+ setUnsavedChangesDialogOpen(false);
1867
+ setEditTransactionOpenInnerSidesheetState({ workflowAction: true });
1868
+ }, []);
1841
1869
  const pdfViewPageId = useMemo(() => {
1842
1870
  return getUiActionRenderPageId(TransactionUiActionTypeEnums.Render_View_Pdf_Page);
1843
1871
  }, [getUiActionRenderPageId]);
@@ -1918,7 +1946,7 @@ const UdpTransactionSidesheet = (props) => {
1918
1946
  width: sidesheetWidth,
1919
1947
  buttonLabel: "Next Steps",
1920
1948
  buttonOneDisabled: transactionIsClosed,
1921
- onSubmit: () => setEditTransactionOpenInnerSidesheetState({ workflowAction: true }),
1949
+ onSubmit: handleNextStepsAction,
1922
1950
  buttonTwoLabel: "Close " + domainName,
1923
1951
  buttonTwoDisabled: transactionIsClosed || !hasClosedStatus,
1924
1952
  buttonTwoAction: () => setDialogOpen(true),
@@ -1930,7 +1958,8 @@ const UdpTransactionSidesheet = (props) => {
1930
1958
  setOpenInnerSidesheetState: setEditTransactionOpenInnerSidesheetState,
1931
1959
  refreshGridData,
1932
1960
  closeSideSheet: () => handleSidesheet("edit", false),
1933
- setSidesheetLoading
1961
+ setSidesheetLoading,
1962
+ setHasUnsavedChanges
1934
1963
  })
1935
1964
  },
1936
1965
  {
@@ -1965,7 +1994,8 @@ const UdpTransactionSidesheet = (props) => {
1965
1994
  transactionIsClosed,
1966
1995
  viewTransactionPage,
1967
1996
  pdfViewPageId,
1968
- sidesheetWidth
1997
+ sidesheetWidth,
1998
+ handleNextStepsAction
1969
1999
  ]);
1970
2000
  return /* @__PURE__ */ React.createElement(React.Fragment, null, openStates && sidesheetList.map((item) => {
1971
2001
  return /* @__PURE__ */ React.createElement(SideSheet, {
@@ -1984,7 +2014,7 @@ const UdpTransactionSidesheet = (props) => {
1984
2014
  buttonTwoDisabled: item?.buttonTwoDisabled,
1985
2015
  progress: sidesheetLoading,
1986
2016
  variant: "indeterminate"
1987
- }, sidesheetLoading && /* @__PURE__ */ React.createElement(LinearProgress$1, null), /* @__PURE__ */ React.createElement("div", null, item.children));
2017
+ }, /* @__PURE__ */ React.createElement("div", null, item.children));
1988
2018
  }), /* @__PURE__ */ React.createElement(FluentDialog, {
1989
2019
  title: t(`Close Transaction`),
1990
2020
  message: `Are you sure you want to close transaction for ${transaction?.entityBusinessKey || ""}?`,
@@ -1995,6 +2025,16 @@ const UdpTransactionSidesheet = (props) => {
1995
2025
  open: dialogOpen,
1996
2026
  handleClose: handleDialogClose,
1997
2027
  loading: closingTransactionLoading
2028
+ }), /* @__PURE__ */ React.createElement(FluentDialog, {
2029
+ title: t(`Unsaved Changes`),
2030
+ message: `You have unsaved changes. Are you sure you want to go to next steps?`,
2031
+ labelOne: t("Confirm"),
2032
+ actionOne: handleConfirmUnsavedChangesDialog,
2033
+ labelTwo: t("Cancel"),
2034
+ actionTwo: handleUnsavedChangesDialogClose,
2035
+ open: unsavedChangesDialogOpen,
2036
+ handleClose: handleUnsavedChangesDialogClose,
2037
+ loading: closingTransactionLoading
1998
2038
  }));
1999
2039
  };
2000
2040
  var UdpTransactionSidesheet_default = UdpTransactionSidesheet;
@@ -2063,10 +2103,63 @@ const useTransactionType = (options = {}) => {
2063
2103
  };
2064
2104
  };
2065
2105
 
2106
+ //#endregion
2107
+ //#region src/hooks/useUdpGridFilterModel.js
2108
+ const useUdpGridFilterModel = () => {
2109
+ const { search } = useLocation();
2110
+ const searchParams = useMemo(() => new URLSearchParams(search), [search]);
2111
+ return useMemo(() => {
2112
+ const constructedFilterModel = {};
2113
+ searchParams.forEach((value, key) => {
2114
+ if (key.startsWith("udp_search-")) {
2115
+ const paramBody = key.replace("udp_search-", "");
2116
+ const lastHyphenIndex = paramBody.lastIndexOf("-");
2117
+ if (lastHyphenIndex !== -1) {
2118
+ const field = paramBody.substring(0, lastHyphenIndex);
2119
+ const operator = paramBody.substring(lastHyphenIndex + 1).replace(/_([a-z])/g, (_, char) => char.toUpperCase());
2120
+ const { filterType, filterKey, parsedValue } = parseFilterValue(value);
2121
+ if (constructedFilterModel[field]) constructedFilterModel[field].conditions.push({
2122
+ filterType,
2123
+ type: operator,
2124
+ [filterKey]: parsedValue
2125
+ });
2126
+ else constructedFilterModel[field] = {
2127
+ filterType,
2128
+ operator: "OR",
2129
+ conditions: [{
2130
+ filterType,
2131
+ type: operator,
2132
+ [filterKey]: parsedValue
2133
+ }]
2134
+ };
2135
+ }
2136
+ }
2137
+ });
2138
+ return constructedFilterModel;
2139
+ }, [searchParams]);
2140
+ };
2141
+ const parseFilterValue = (value) => {
2142
+ if (!isNaN(Date.parse(value)) && (value.includes("-") || value.includes("/"))) return {
2143
+ filterType: "date",
2144
+ filterKey: "dateFrom",
2145
+ parsedValue: value
2146
+ };
2147
+ if (!isNaN(value) && !isNaN(parseFloat(value))) return {
2148
+ filterType: "number",
2149
+ filterKey: "filter",
2150
+ parsedValue: Number(value)
2151
+ };
2152
+ return {
2153
+ filterType: "text",
2154
+ filterKey: "filter",
2155
+ parsedValue: value
2156
+ };
2157
+ };
2158
+
2066
2159
  //#endregion
2067
2160
  //#region src/udp/pages/UdpTransactionsPage/UdpTransactionsPage.jsx
2068
2161
  const UdpTransactionsPage = (props) => {
2069
- const { transactionTypeId = "", domainName: initialDomainName = "", domainFieldType, domainFieldValue, searchMethodObject, domainColumnFormatters, initialFilterModel } = props;
2162
+ const { transactionTypeId = "", domainName: initialDomainName = "", domainFieldType, domainFieldValue, searchMethodObject, domainColumnFormatters, gridOptions } = props;
2070
2163
  const [sidesheetState, setSidesheetState] = useState({
2071
2164
  workflowAction: false,
2072
2165
  addTransaction: false,
@@ -2084,6 +2177,7 @@ const UdpTransactionsPage = (props) => {
2084
2177
  domainFieldValue
2085
2178
  });
2086
2179
  useTransactionEngine(transactionType?.transactionTypeId);
2180
+ const filterModel = useUdpGridFilterModel();
2087
2181
  const handleSidesheet = (actionType, openStatus, transaction, width = 800) => {
2088
2182
  if (actionType == "add") setSidesheetState({
2089
2183
  addTransaction: openStatus,
@@ -2150,7 +2244,8 @@ const UdpTransactionsPage = (props) => {
2150
2244
  gridApi?.refreshServerSide();
2151
2245
  },
2152
2246
  gridApi,
2153
- initialFilterModel
2247
+ initialFilterModel: filterModel,
2248
+ initialGridOptions: gridOptions
2154
2249
  }), /* @__PURE__ */ React.createElement(UdpTransactionSidesheet_default, {
2155
2250
  openStates: sidesheetState,
2156
2251
  handleSidesheet,
@@ -2171,4 +2266,4 @@ var UdpTransactionsPage_exports = /* @__PURE__ */ __exportAll({ default: () => U
2171
2266
 
2172
2267
  //#endregion
2173
2268
  export { UdpTransactionsPage_default as n, UdpTransactionsPage_exports as t };
2174
- //# sourceMappingURL=UdpTransactionsPage-DXt_i8vP.js.map
2269
+ //# sourceMappingURL=UdpTransactionsPage-Dr3XbvFa.js.map