@olenbetong/synergi-react 2.2.3 → 2.3.0

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 (116) hide show
  1. package/es/components/FilePond.d.ts +8 -5
  2. package/es/components/FilePond.js +47 -20
  3. package/es/elements/ElementDamage/DamageFormButtons.d.ts +9 -0
  4. package/es/elements/ElementDamage/DamageFormButtons.js +7 -0
  5. package/es/elements/ElementDamage/DescriptionInput.d.ts +14 -0
  6. package/es/elements/ElementDamage/DescriptionInput.js +44 -0
  7. package/es/elements/{ElementDamageForm/DuplicateDamage/DuplicateElementDamageDialog.d.ts → ElementDamage/DuplicateDamage/DublicateElementDamageDialog.d.ts} +4 -3
  8. package/es/elements/ElementDamage/DuplicateDamage/DublicateElementDamageDialog.js +12 -0
  9. package/es/elements/ElementDamage/DuplicateDamage/index.d.ts +36 -0
  10. package/es/elements/ElementDamage/DuplicateDamage/index.js +40 -0
  11. package/es/elements/ElementDamage/ElementNumberTextField.d.ts +10 -0
  12. package/es/elements/ElementDamage/ElementNumberTextField.js +18 -0
  13. package/es/elements/ElementDamage/HiddenDamageFields.d.ts +6 -0
  14. package/es/elements/ElementDamage/HiddenDamageFields.js +4 -0
  15. package/es/elements/ElementDamage/RegisterFix.d.ts +14 -0
  16. package/es/elements/ElementDamage/RegisterFix.js +45 -0
  17. package/es/elements/ElementDamage/SubmitButtons.d.ts +20 -0
  18. package/es/elements/ElementDamage/SubmitButtons.js +7 -0
  19. package/es/elements/ElementDamage/TransportElementSelect.d.ts +7 -0
  20. package/es/elements/ElementDamage/TransportElementSelect.js +16 -0
  21. package/es/elements/ElementLookup.d.ts +20 -0
  22. package/es/elements/ElementLookup.js +30 -0
  23. package/es/elements/{AddElementDialog → ElementLookupDialog}/Manual/ManualForm.js +4 -2
  24. package/es/elements/{AddElementDialog → ElementLookupDialog}/getElement.d.ts +1 -0
  25. package/es/elements/{AddElementDialog → ElementLookupDialog}/getElement.js +1 -0
  26. package/es/elements/{AddElementDialog → ElementLookupDialog}/index.d.ts +5 -5
  27. package/es/elements/{AddElementDialog → ElementLookupDialog}/index.js +4 -1
  28. package/es/elements/ProjectSelect.js +9 -2
  29. package/es/elements/data/dsDamages.d.ts +1 -1
  30. package/es/elements/data/dsDamages.js +2 -2
  31. package/es/elements/data/dsElements.d.ts +2 -0
  32. package/es/elements/data/dsElements.js +11 -1
  33. package/es/elements/data/dsTransportElements.d.ts +10 -0
  34. package/es/elements/data/dsTransportElements.js +57 -0
  35. package/es/elements/data/index.d.ts +5 -1
  36. package/es/elements/data/index.js +5 -1
  37. package/es/elements/data/procDeleteAttachment.d.ts +2 -0
  38. package/es/elements/data/procDeleteAttachment.js +18 -0
  39. package/es/elements/data/procDeleteDamage.d.ts +2 -0
  40. package/es/elements/data/procDeleteDamage.js +18 -0
  41. package/es/elements/data/procRemoveDamageFix.d.ts +2 -0
  42. package/es/elements/data/procRemoveDamageFix.js +18 -0
  43. package/es/elements/data/procRestoreAttachments.d.ts +2 -0
  44. package/es/elements/data/procRestoreAttachments.js +18 -0
  45. package/es/elements/index.d.ts +8 -2
  46. package/es/elements/index.js +8 -2
  47. package/es/index.d.ts +1 -1
  48. package/es/index.js +1 -1
  49. package/package.json +1 -1
  50. package/src/components/FilePond.tsx +73 -26
  51. package/src/elements/ElementDamage/DamageFormButtons.tsx +35 -0
  52. package/src/elements/ElementDamage/DescriptionInput.tsx +111 -0
  53. package/src/elements/{ElementDamageForm/DuplicateDamage/DuplicateElementDamageDialog.tsx → ElementDamage/DuplicateDamage/DublicateElementDamageDialog.tsx} +24 -9
  54. package/src/elements/ElementDamage/DuplicateDamage/index.tsx +105 -0
  55. package/src/elements/ElementDamage/ElementNumberTextField.tsx +41 -0
  56. package/src/elements/ElementDamage/HiddenDamageFields.tsx +13 -0
  57. package/src/elements/ElementDamage/RegisterFix.tsx +100 -0
  58. package/src/elements/ElementDamage/SubmitButtons.tsx +40 -0
  59. package/src/elements/ElementDamage/TransportElementSelect.tsx +52 -0
  60. package/src/elements/ElementLookup.tsx +90 -0
  61. package/src/elements/{AddElementDialog → ElementLookupDialog}/Manual/ManualForm.tsx +5 -2
  62. package/src/elements/{AddElementDialog → ElementLookupDialog}/getElement.ts +2 -0
  63. package/src/elements/{AddElementDialog → ElementLookupDialog}/index.tsx +9 -5
  64. package/src/elements/ProjectSelect.tsx +13 -3
  65. package/src/elements/data/dsDamages.ts +3 -3
  66. package/src/elements/data/dsElements.ts +13 -1
  67. package/src/elements/data/dsTransportElements.ts +68 -0
  68. package/src/elements/data/index.ts +5 -1
  69. package/src/elements/data/procDeleteAttachment.ts +19 -0
  70. package/src/elements/data/procDeleteDamage.ts +19 -0
  71. package/src/elements/data/procRemoveDamageFix.ts +19 -0
  72. package/src/elements/data/procRestoreAttachments.ts +19 -0
  73. package/src/elements/index.ts +8 -3
  74. package/src/index.ts +1 -1
  75. package/es/elements/ElementDamageForm/DamageFormFields.d.ts +0 -12
  76. package/es/elements/ElementDamageForm/DamageFormFields.js +0 -39
  77. package/es/elements/ElementDamageForm/DuplicateDamage/DuplicateElementDamageDialog.js +0 -11
  78. package/es/elements/ElementDamageForm/index.d.ts +0 -13
  79. package/es/elements/ElementDamageForm/index.js +0 -219
  80. package/src/elements/ElementDamageForm/DamageFormFields.tsx +0 -149
  81. package/src/elements/ElementDamageForm/index.tsx +0 -397
  82. /package/es/elements/{ElementDamageForm → ElementDamage}/DuplicateDamage/DesktopView.d.ts +0 -0
  83. /package/es/elements/{ElementDamageForm → ElementDamage}/DuplicateDamage/DesktopView.js +0 -0
  84. /package/es/elements/{ElementDamageForm → ElementDamage}/DuplicateDamage/PhoneView.d.ts +0 -0
  85. /package/es/elements/{ElementDamageForm → ElementDamage}/DuplicateDamage/PhoneView.js +0 -0
  86. /package/es/elements/{ElementDamageForm → ElementDamage}/index.css +0 -0
  87. /package/es/elements/{AddElementDialog → ElementLookupDialog}/BarcodeScanner/DeadIcon.d.ts +0 -0
  88. /package/es/elements/{AddElementDialog → ElementLookupDialog}/BarcodeScanner/DeadIcon.js +0 -0
  89. /package/es/elements/{AddElementDialog → ElementLookupDialog}/BarcodeScanner/Error.d.ts +0 -0
  90. /package/es/elements/{AddElementDialog → ElementLookupDialog}/BarcodeScanner/Error.js +0 -0
  91. /package/es/elements/{AddElementDialog → ElementLookupDialog}/BarcodeScanner/index.d.ts +0 -0
  92. /package/es/elements/{AddElementDialog → ElementLookupDialog}/BarcodeScanner/index.js +0 -0
  93. /package/es/elements/{AddElementDialog → ElementLookupDialog}/BarcodeScanner/useScanner.d.ts +0 -0
  94. /package/es/elements/{AddElementDialog → ElementLookupDialog}/BarcodeScanner/useScanner.js +0 -0
  95. /package/es/elements/{AddElementDialog → ElementLookupDialog}/HIDScanner/index.css +0 -0
  96. /package/es/elements/{AddElementDialog → ElementLookupDialog}/HIDScanner/index.d.ts +0 -0
  97. /package/es/elements/{AddElementDialog → ElementLookupDialog}/HIDScanner/index.js +0 -0
  98. /package/es/elements/{AddElementDialog → ElementLookupDialog}/HIDScanner/useHIDScanner.d.ts +0 -0
  99. /package/es/elements/{AddElementDialog → ElementLookupDialog}/HIDScanner/useHIDScanner.js +0 -0
  100. /package/es/elements/{AddElementDialog → ElementLookupDialog}/Manual/ManualForm.d.ts +0 -0
  101. /package/es/elements/{AddElementDialog → ElementLookupDialog}/utils/Giai.d.ts +0 -0
  102. /package/es/elements/{AddElementDialog → ElementLookupDialog}/utils/Giai.js +0 -0
  103. /package/es/elements/{AddElementDialog → ElementLookupDialog}/utils/beep.d.ts +0 -0
  104. /package/es/elements/{AddElementDialog → ElementLookupDialog}/utils/beep.js +0 -0
  105. /package/src/elements/{ElementDamageForm → ElementDamage}/DuplicateDamage/DesktopView.tsx +0 -0
  106. /package/src/elements/{ElementDamageForm → ElementDamage}/DuplicateDamage/PhoneView.tsx +0 -0
  107. /package/src/elements/{ElementDamageForm → ElementDamage}/index.css +0 -0
  108. /package/src/elements/{AddElementDialog → ElementLookupDialog}/BarcodeScanner/DeadIcon.tsx +0 -0
  109. /package/src/elements/{AddElementDialog → ElementLookupDialog}/BarcodeScanner/Error.tsx +0 -0
  110. /package/src/elements/{AddElementDialog → ElementLookupDialog}/BarcodeScanner/index.tsx +0 -0
  111. /package/src/elements/{AddElementDialog → ElementLookupDialog}/BarcodeScanner/useScanner.ts +0 -0
  112. /package/src/elements/{AddElementDialog → ElementLookupDialog}/HIDScanner/index.css +0 -0
  113. /package/src/elements/{AddElementDialog → ElementLookupDialog}/HIDScanner/index.tsx +0 -0
  114. /package/src/elements/{AddElementDialog → ElementLookupDialog}/HIDScanner/useHIDScanner.ts +0 -0
  115. /package/src/elements/{AddElementDialog → ElementLookupDialog}/utils/Giai.ts +0 -0
  116. /package/src/elements/{AddElementDialog → ElementLookupDialog}/utils/beep.ts +0 -0
@@ -1,149 +0,0 @@
1
- import AddAPhotoIcon from "@mui/icons-material/AddAPhoto";
2
- import { Autocomplete, Box, Button, TextField } from "@mui/material";
3
- import { getLocalizedString } from "@olenbetong/appframe-core";
4
-
5
- import { useState } from "react";
6
- import type { DamagesRecord, ElementsRecord, ProjectsRecord } from "../data";
7
-
8
- type DamageFormFieldsProps = {
9
- editRecord: DamagesRecord | null;
10
- project: Partial<ProjectsRecord> | null;
11
- elementRecord: ElementsRecord[];
12
- elementID: string;
13
- attachmentPrimKeys: string[];
14
- handleAddElement: () => void;
15
- formName: string;
16
- };
17
-
18
- export function DamageFormFields({
19
- editRecord,
20
- project,
21
- elementRecord,
22
- elementID,
23
- attachmentPrimKeys,
24
- handleAddElement,
25
- formName,
26
- }: DamageFormFieldsProps) {
27
- let [description, setDescription] = useState<string | undefined>();
28
-
29
- function handleCopyPreviousDamage() {
30
- const form = document.forms.namedItem(formName);
31
- if (form) {
32
- form["Cause"].value = localStorage.getItem("ElementDamage_Cause")?.toString();
33
- form["Action"].value = localStorage.getItem("ElementDamage_Action")?.toString();
34
- }
35
- setDescription(localStorage.getItem("ElementDamage_Description")?.toString());
36
- }
37
-
38
- return (
39
- <>
40
- <input type="hidden" name="ID" value={editRecord?.ID ?? ""} />
41
- <input type="hidden" name="PrimKey" value={editRecord?.PrimKey ?? ""} />
42
- <input type="hidden" name="ProjectID" value={project?.ProjectID ?? ""} />
43
- <input type="hidden" name="Domain" value={project?.Domain ?? ""} />
44
- <input type="hidden" name="ElementRef" value={elementRecord[0]?.PrimKey ?? ""} />
45
- <input type="hidden" name="AttachmentPrimkeys" value={attachmentPrimKeys} />
46
-
47
- <TextField
48
- name="Date"
49
- type="date"
50
- defaultValue={(editRecord?.Date ?? new Date()).toISOString().split("T")[0]}
51
- id="NewElementDamage_Date"
52
- label={getLocalizedString("Date")}
53
- fullWidth
54
- required
55
- slotProps={{ inputLabel: { shrink: true } }}
56
- />
57
-
58
- <Box display="flex" gap={2} justifyContent="flex-end">
59
- <Button
60
- variant="contained"
61
- onClick={() => handleCopyPreviousDamage()}
62
- disabled={!localStorage.getItem("ElementDamage_Description")}
63
- >
64
- {getLocalizedString("Copy previous damage")}
65
- </Button>
66
- <Button onClick={handleAddElement} endIcon={<AddAPhotoIcon />} variant="contained">
67
- {getLocalizedString("Add element")}
68
- </Button>
69
- </Box>
70
-
71
- <TextField
72
- id="NewElementDamage_Project"
73
- value={project ? `${project?.ProjectID}: ${project?.ProjectName}` : ""}
74
- label={getLocalizedString("Project")}
75
- fullWidth
76
- required
77
- autoComplete="off"
78
- slotProps={{
79
- htmlInput: { readOnly: true },
80
- }}
81
- />
82
-
83
- <TextField
84
- name="ElementID"
85
- id="NewElementDamage_ElementID"
86
- value={elementID}
87
- label={getLocalizedString("Element ID")}
88
- fullWidth
89
- autoComplete="off"
90
- slotProps={{
91
- htmlInput: { readOnly: true },
92
- }}
93
- />
94
-
95
- <TextField
96
- name="ElementNumber"
97
- id="NewElementDamage_ElementNr"
98
- defaultValue={editRecord?.ElementNumber ?? ""}
99
- label={getLocalizedString("Element number")}
100
- fullWidth
101
- autoComplete="off"
102
- disabled={!!elementID}
103
- />
104
-
105
- <Autocomplete
106
- value={description ?? editRecord?.Description ?? ""}
107
- options={[
108
- getLocalizedString("Tear in element"),
109
- getLocalizedString("Damage around lifting anchor"),
110
- getLocalizedString("Damage on underside"),
111
- ]}
112
- freeSolo
113
- renderInput={(params) => (
114
- <TextField name="Description" required {...(params as any)} label={getLocalizedString("Description")} />
115
- )}
116
- />
117
- <TextField
118
- name="Cause"
119
- id="NewElementDamage_Cause"
120
- defaultValue={editRecord?.Cause ?? ""}
121
- label={getLocalizedString("Cause")}
122
- fullWidth
123
- slotProps={{
124
- inputLabel: {
125
- shrink: (() => {
126
- const form = document.forms.namedItem(formName);
127
- return form?.["Cause"]?.value ? true : undefined;
128
- })(),
129
- },
130
- }}
131
- />
132
- <TextField
133
- name="Action"
134
- id="NewElementDamage_Action"
135
- defaultValue={editRecord?.Action ?? ""}
136
- label={getLocalizedString("Action")}
137
- fullWidth
138
- slotProps={{
139
- inputLabel: {
140
- shrink: (() => {
141
- const form = document.forms.namedItem(formName);
142
- return form?.["Action"]?.value ? true : undefined;
143
- })(),
144
- },
145
- }}
146
- />
147
- </>
148
- );
149
- }
@@ -1,397 +0,0 @@
1
- import "./index.css";
2
-
3
- import Add from "@mui/icons-material/Add";
4
- import CheckIcon from "@mui/icons-material/Check";
5
-
6
- import { Box, Button, Checkbox, FormControlLabel, Typography } from "@mui/material";
7
- import Alert from "@mui/material/Alert";
8
- import { getLocalizedString, localize } from "@olenbetong/appframe-core";
9
- import { type DataObject, formDataToDataObjectRecord } from "@olenbetong/appframe-data";
10
- import { PageContainer, PageTitle } from "@olenbetong/appframe-mui";
11
- import { useDataWithFilter } from "@olenbetong/appframe-react";
12
-
13
- import { type FormEvent, useId, useRef, useState } from "react";
14
- import { FilePond } from "../../components/FilePond";
15
- import { type AddElement, AddElementDialog } from "../AddElementDialog";
16
- import {
17
- type AttachmentsRecord,
18
- type CurrentAttachmentRecord,
19
- type DamagesRecord,
20
- dsDamagesDuplicateCheck,
21
- type ElementsRecord,
22
- type ProjectsRecord,
23
- procApproveDamage,
24
- } from "../data";
25
- import { DamageFormFields } from "./DamageFormFields";
26
- import { DuplicateElementDamageDialog } from "./DuplicateDamage/DuplicateElementDamageDialog";
27
-
28
- const formatter = new Intl.DateTimeFormat(af.userSession.culture, {
29
- day: "numeric",
30
- month: "long",
31
- year: "numeric",
32
- hour: "2-digit",
33
- minute: "2-digit",
34
- timeZone: "UTC",
35
- });
36
-
37
- function deleteAttachments(
38
- dataObject: DataObject<AttachmentsRecord> | DataObject<CurrentAttachmentRecord>,
39
- primKeyArray: string[],
40
- ) {
41
- for (const primKey of primKeyArray) {
42
- const index = dataObject.findIndex((record) => record.PrimKey === primKey);
43
-
44
- if (index > -1) {
45
- dataObject.deleteRow(index);
46
- }
47
- }
48
- }
49
-
50
- type RegisterFixProps = {
51
- editRecord: DamagesRecord | null;
52
- damageDataObject: DataObject<DamagesRecord>;
53
- fixedThisSession: boolean;
54
- setFixedThisSession: React.Dispatch<React.SetStateAction<boolean>>;
55
- };
56
-
57
- function RegisterFix({ editRecord, damageDataObject, fixedThisSession, setFixedThisSession }: RegisterFixProps) {
58
- const [loading, setLoading] = useState<boolean>(false);
59
-
60
- async function handleRegisterFix() {
61
- try {
62
- if (confirm(getLocalizedString("Are you sure you want to register a fix for this damage?"))) {
63
- setLoading(true);
64
- await procApproveDamage.execute({ ID: editRecord?.ID });
65
- await damageDataObject.refreshCurrentRow();
66
-
67
- setLoading(false);
68
- setFixedThisSession(true);
69
- }
70
- } catch (error) {
71
- alert((error as Error).message);
72
- }
73
- }
74
-
75
- return (
76
- <>
77
- {editRecord ? (
78
- <Box display="flex" justifyContent="flex-end">
79
- <Button
80
- loading={loading}
81
- loadingPosition="end"
82
- endIcon={<CheckIcon />}
83
- onClick={handleRegisterFix}
84
- disabled={!!editRecord.RegisteredFix || fixedThisSession}
85
- variant="contained"
86
- >
87
- {getLocalizedString("Register fix")}
88
- </Button>
89
- </Box>
90
- ) : (
91
- <FormControlLabel
92
- control={<Checkbox />}
93
- label={getLocalizedString("Register fixed")}
94
- name="RegisteredFix"
95
- id="NewElementDamage_RegisteredFix"
96
- />
97
- )}
98
-
99
- {editRecord?.RegisteredFix && (
100
- <Typography mb={1.5} color="text.secondary">
101
- {localize`Registered fix by ${editRecord.FullName ?? editRecord.RegisteredFixBy} on the ${formatter.format(editRecord.RegisteredFix)}`}
102
- </Typography>
103
- )}
104
- </>
105
- );
106
- }
107
-
108
- type ElementDamageFormProps = {
109
- editRecord: DamagesRecord | null;
110
- elementsDataObject: DataObject<ElementsRecord>;
111
- damagesDataObject: DataObject<DamagesRecord>;
112
- attachmentsDataObject: DataObject<AttachmentsRecord>;
113
- currentAttachmentDataObject: DataObject<CurrentAttachmentRecord>;
114
- fallBack: () => void;
115
- };
116
-
117
- export function ElementDamageForm({
118
- editRecord,
119
- elementsDataObject,
120
- damagesDataObject,
121
- attachmentsDataObject,
122
- currentAttachmentDataObject,
123
- fallBack,
124
- }: ElementDamageFormProps) {
125
- let formName = useId();
126
- let formRef = useRef<HTMLFormElement | null>(null);
127
-
128
- // Data object values
129
- let [project, setProject] = useState<Partial<ProjectsRecord> | null>(
130
- editRecord
131
- ? { ProjectID: editRecord.ProjectID, ProjectName: editRecord.ProjectName, Domain: editRecord.Domain }
132
- : null,
133
- );
134
- let [elementID, setElementID] = useState<string>(editRecord?.ElementID ?? "");
135
- let [attachmentPrimKeys, setAttachmentPrimKeys] = useState<string[]>([]);
136
- let [duplicateRecords, setDuplicateRecords] = useState<DamagesRecord[]>([]);
137
- let damagesDuplicateRecord = useDataWithFilter(dsDamagesDuplicateCheck, "1=1", "whereClause");
138
- let elementRecord = useDataWithFilter(
139
- elementsDataObject,
140
- `ProjectID = '${project?.ProjectID}' AND ElementID = '${elementID}'`,
141
- "whereClause",
142
- );
143
-
144
- // Event values
145
- let [addElementOpen, setAddElementOpen] = useState<boolean>(!editRecord); // Opens by default when form is new
146
- let [loading, setLoading] = useState<boolean>(false);
147
- let [uploadingFile, setUploadingFile] = useState<boolean>(false);
148
- let [fixedThisSession, setFixedThisSession] = useState(false); // Element is registered fixed during this editing session
149
- let [duplicateDialog, setDuplicateDialog] = useState(false);
150
-
151
- // Error values
152
- let [error, setError] = useState<string | null>(null);
153
-
154
- async function handleAddElement(addElement: AddElement) {
155
- setProject({
156
- ProjectID: addElement.element.ProjectID,
157
- ProjectName: addElement.element.ProjectName,
158
- Domain: addElement.element.ProjectDomain,
159
- });
160
- setElementID(addElement.element.ElementID);
161
- }
162
-
163
- async function handleDelete(row: DamagesRecord) {
164
- try {
165
- let index = damagesDataObject.findIndex((r) => r.PrimKey === row.PrimKey);
166
-
167
- if (index >= 0 && confirm(getLocalizedString("Are you sure you want to delete this item?"))) {
168
- let primKeyArray = currentAttachmentDataObject.map((record) => record.PrimKey);
169
- deleteAttachments(currentAttachmentDataObject, primKeyArray);
170
-
171
- await damagesDataObject.deleteRow(index);
172
- }
173
-
174
- fallBack();
175
- } catch (error: any) {
176
- setError(error.message);
177
- }
178
- }
179
-
180
- async function handleCancel() {
181
- // Remove the registered fix if it was registered this session
182
- if (editRecord && fixedThisSession) {
183
- damagesDataObject.setCurrentIndex(damagesDataObject.findIndex((record) => record.ID === editRecord.ID));
184
- await damagesDataObject.refreshCurrentRow();
185
- await damagesDataObject.save({
186
- RegisteredFix: null,
187
- RegisteredFixBy: null,
188
- });
189
- }
190
-
191
- // Remove attachments if they are not saved
192
- if (attachmentPrimKeys) {
193
- await attachmentsDataObject.refreshDataSource();
194
- const primKeyArray = attachmentPrimKeys.toString().split(",");
195
- deleteAttachments(attachmentsDataObject, primKeyArray);
196
- }
197
-
198
- fallBack();
199
- }
200
-
201
- // Returning true means a duplicate is found and confirmation dialog will open
202
- function isDuplicate(): boolean {
203
- // If we are editing a record, we don't need to check for duplicates
204
- if (editRecord) {
205
- return false;
206
- }
207
-
208
- const filteredRecord = damagesDuplicateRecord.filter(
209
- (record) => record.ElementID === elementID && record.ProjectID === project?.ProjectID && !record.RegisteredFix,
210
- );
211
-
212
- if (filteredRecord.length > 0) {
213
- setDuplicateRecords(filteredRecord);
214
- setDuplicateDialog(true);
215
-
216
- return true;
217
- }
218
-
219
- return false;
220
- }
221
-
222
- async function handleSubmit(event: FormEvent<HTMLFormElement>) {
223
- event.preventDefault();
224
- setLoading(true);
225
- if (duplicateRecords.length <= 0) {
226
- if (isDuplicate()) {
227
- return;
228
- }
229
- }
230
-
231
- try {
232
- let formData = new FormData(event.currentTarget);
233
- let attachmentPrimKeys = formData.get("AttachmentPrimkeys") as string | null;
234
- let elementID = formData.get("ElementID") as string | null;
235
- let elementNumber = formData.get("ElementNumber") as string | null;
236
- formData.delete("File");
237
- formData.delete("AttachmentPrimkeys");
238
-
239
- if (!elementID && !elementNumber) {
240
- setError(getLocalizedString("Please fill in either Element ID or Element Number"));
241
- return;
242
- }
243
-
244
- localStorage.setItem("ElementDamage_Description", formData.get("Description")?.toString() ?? "");
245
- localStorage.setItem("ElementDamage_Cause", formData.get("Cause")?.toString() ?? "");
246
- localStorage.setItem("ElementDamage_Action", formData.get("Action")?.toString() ?? "");
247
-
248
- let record = Object.assign({ ...formDataToDataObjectRecord(formData, damagesDataObject) });
249
-
250
- if (formData.get("ID")) {
251
- record.ID = undefined;
252
- await damagesDataObject.dataHandler.update(record);
253
- submitReturn();
254
- return;
255
- } else {
256
- damagesDataObject.setCurrentIndex(-1);
257
-
258
- // If the RegisteredFix Control Label is checked then it will exist in the record object
259
- let newJob: DamagesRecord | false;
260
- if ("RegisteredFix" in record) {
261
- newJob = await damagesDataObject.save({
262
- ...record,
263
- RegisteredFix: new Date(),
264
- RegisteredFixBy: af.userSession.login,
265
- });
266
- } else {
267
- newJob = await damagesDataObject.save(record);
268
- }
269
-
270
- await new Promise((res) => setTimeout(res, 1500));
271
-
272
- if (newJob) {
273
- // Update ElementDamageID in attachments table
274
- if (attachmentPrimKeys) {
275
- await attachmentsDataObject.refreshDataSource();
276
- const primKeyArray: string[] = attachmentPrimKeys.toString().split(",");
277
-
278
- for (const primKey of primKeyArray) {
279
- attachmentsDataObject.setCurrentIndex(
280
- attachmentsDataObject.findIndex((record) => record.PrimKey === primKey),
281
- );
282
-
283
- if (attachmentsDataObject.getCurrentIndex() > -1) {
284
- await attachmentsDataObject.save({
285
- DamageID: newJob.ID,
286
- ElementRef: newJob.ElementRef,
287
- ProjectID: newJob.ProjectID,
288
- ElementID: newJob.ElementID,
289
- ElementNumber: newJob.ElementNumber,
290
- Domain: formData.get("Domain")?.toString() ?? af.userSession.domain,
291
- Damage: true,
292
- });
293
- }
294
- }
295
- }
296
-
297
- submitReturn();
298
- return;
299
- } else {
300
- setError(getLocalizedString("No job returned when creating new job."));
301
- return;
302
- }
303
- }
304
- } catch (error) {
305
- submitReturn((error as Error).message);
306
- return;
307
- }
308
- }
309
-
310
- function submitReturn(error?: string) {
311
- if (!error) {
312
- fallBack();
313
- } else {
314
- setError(error);
315
- }
316
- setLoading(false);
317
- }
318
-
319
- return (
320
- <PageContainer maxWidth="sm">
321
- <PageTitle variant="h1" gutterBottom>
322
- {getLocalizedString("New element damage")}
323
- </PageTitle>
324
-
325
- <AddElementDialog
326
- open={addElementOpen}
327
- mode="single"
328
- onClose={() => setAddElementOpen(false)}
329
- onAdd={handleAddElement}
330
- />
331
- <form name={formName} ref={formRef} method="POST" onSubmit={handleSubmit} className="flow">
332
- <DuplicateElementDamageDialog
333
- open={duplicateDialog}
334
- onClose={setDuplicateDialog}
335
- record={duplicateRecords}
336
- fallBack={fallBack}
337
- />
338
-
339
- {error && (
340
- <Alert severity="error" variant="filled">
341
- {error}
342
- </Alert>
343
- )}
344
-
345
- <DamageFormFields
346
- editRecord={editRecord}
347
- project={project}
348
- elementRecord={elementRecord}
349
- attachmentPrimKeys={[]}
350
- elementID={elementID}
351
- formName={formName}
352
- handleAddElement={() => setAddElementOpen(true)}
353
- />
354
-
355
- <Box display="flex" flexDirection="column">
356
- <Typography variant="h3">{getLocalizedString("Pictures")}</Typography>
357
- <FilePond
358
- multiple
359
- dataObject={currentAttachmentDataObject}
360
- fields={{
361
- DamageID: editRecord?.ID,
362
- ElementID: editRecord?.ElementID,
363
- ProjectID: editRecord?.ProjectID,
364
- ElementRef: editRecord?.ElementRef,
365
- Damage: true,
366
- }}
367
- onFileStart={() => editRecord ?? setUploadingFile(true)}
368
- onFileProcessed={(_error, file) => setAttachmentPrimKeys([...attachmentPrimKeys, file.serverId])}
369
- onFilesProcessed={() => setUploadingFile(false)}
370
- onError={() => setUploadingFile(false)}
371
- />
372
- </Box>
373
-
374
- <RegisterFix
375
- editRecord={editRecord}
376
- damageDataObject={damagesDataObject}
377
- fixedThisSession={fixedThisSession}
378
- setFixedThisSession={setFixedThisSession}
379
- />
380
-
381
- <Box display="flex" flexWrap={"wrap"} gap={2} justifyContent="flex-end">
382
- {editRecord && <Button onClick={() => handleDelete(editRecord)}>{getLocalizedString("Delete")}</Button>}
383
- <Button onClick={handleCancel}>{getLocalizedString("Cancel")}</Button>
384
- <Button
385
- loading={loading || uploadingFile}
386
- loadingPosition="start"
387
- startIcon={<Add />}
388
- type="submit"
389
- variant="contained"
390
- >
391
- {editRecord ? getLocalizedString("Save changes") : getLocalizedString("Register damage")}
392
- </Button>
393
- </Box>
394
- </form>
395
- </PageContainer>
396
- );
397
- }