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.
- package/dist/UI/forms/index.js +1 -1
- package/dist/UI/index.js +1 -1
- package/dist/{UdpFormsSubmissionGrid-B3pQiK5q.js → UdpFormsSubmissionGrid-Qj-ti4hh.js} +57 -63
- package/dist/UdpFormsSubmissionGrid-Qj-ti4hh.js.map +1 -0
- package/dist/{UdpTransactionsPage-DXt_i8vP.js → UdpTransactionsPage-Dr3XbvFa.js} +111 -16
- package/dist/UdpTransactionsPage-Dr3XbvFa.js.map +1 -0
- package/dist/{forms-lyNriVSn.js → forms-sRKithEr.js} +15 -7
- package/dist/{forms-lyNriVSn.js.map → forms-sRKithEr.js.map} +1 -1
- package/dist/index.js +3 -3
- package/dist/types/src/UI/forms/UdpTransactionEmailForm.d.ts +6 -1
- package/dist/types/src/UI/forms/UdpTransactionEmailForm.d.ts.map +1 -1
- package/dist/types/src/hooks/useUdpGridFilterModel.d.ts +2 -0
- package/dist/types/src/hooks/useUdpGridFilterModel.d.ts.map +1 -0
- package/dist/types/src/maintenanceEngine/tableBrowser/TableColumnDefs.d.ts +1 -1
- package/dist/types/src/maintenanceEngine/tableBrowser/TableColumnDefs.d.ts.map +1 -1
- package/dist/types/src/udp/pages/UdpFormsSubmissionGrid/UdpFormsSubmissionGrid.d.ts.map +1 -1
- package/dist/types/src/udp/pages/UdpTransactionsPage/UdpTransactionGrid.d.ts.map +1 -1
- package/dist/types/src/udp/pages/UdpTransactionsPage/UdpTransactionSidesheet.d.ts.map +1 -1
- package/dist/types/src/udp/pages/UdpTransactionsPage/UdpTransactionsPage.d.ts.map +1 -1
- package/dist/types/src/udp/pages/UdpTransactionsPage/components/UdpTransactionCustomPage.d.ts.map +1 -1
- package/dist/types/src/udp/pages/UdpTransactionsPage/sidesheets/EditTransaction.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/dist/udp/pages/UdpFormsSubmissionGrid/index.js +1 -1
- package/dist/udp/pages/UdpPages/index.js +1 -1
- package/dist/udp/pages/UdpTransactionsPage/index.js +1 -1
- package/export-map.json +1 -1
- package/package.json +1 -1
- package/dist/UdpFormsSubmissionGrid-B3pQiK5q.js.map +0 -1
- package/dist/UdpTransactionsPage-DXt_i8vP.js.map +0 -1
package/dist/UI/forms/index.js
CHANGED
|
@@ -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-
|
|
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-
|
|
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
|
|
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
|
|
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
|
|
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 ?
|
|
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 ?
|
|
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 ?
|
|
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 ?
|
|
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
|
|
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-
|
|
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(
|
|
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:
|
|
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
|
-
},
|
|
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,
|
|
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-
|
|
2269
|
+
//# sourceMappingURL=UdpTransactionsPage-Dr3XbvFa.js.map
|