@olenbetong/synergi-react 2.2.3 → 2.3.1
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/es/components/FilePond.d.ts +8 -5
- package/es/components/FilePond.js +47 -20
- package/es/elements/ElementDamage/DamageFormButtons.d.ts +9 -0
- package/es/elements/ElementDamage/DamageFormButtons.js +7 -0
- package/es/elements/ElementDamage/DescriptionInput.d.ts +14 -0
- package/es/elements/ElementDamage/DescriptionInput.js +44 -0
- package/es/elements/{ElementDamageForm/DuplicateDamage/DuplicateElementDamageDialog.d.ts → ElementDamage/DuplicateDamage/DublicateElementDamageDialog.d.ts} +4 -3
- package/es/elements/ElementDamage/DuplicateDamage/DublicateElementDamageDialog.js +12 -0
- package/es/elements/ElementDamage/DuplicateDamage/index.d.ts +36 -0
- package/es/elements/ElementDamage/DuplicateDamage/index.js +40 -0
- package/es/elements/ElementDamage/ElementNumberTextField.d.ts +10 -0
- package/es/elements/ElementDamage/ElementNumberTextField.js +18 -0
- package/es/elements/ElementDamage/HiddenDamageFields.d.ts +6 -0
- package/es/elements/ElementDamage/HiddenDamageFields.js +4 -0
- package/es/elements/ElementDamage/RegisterFix.d.ts +14 -0
- package/es/elements/ElementDamage/RegisterFix.js +45 -0
- package/es/elements/ElementDamage/SubmitButtons.d.ts +20 -0
- package/es/elements/ElementDamage/SubmitButtons.js +7 -0
- package/es/elements/ElementDamage/TransportElementSelect.d.ts +7 -0
- package/es/elements/ElementDamage/TransportElementSelect.js +16 -0
- package/es/elements/ElementLookup.d.ts +20 -0
- package/es/elements/ElementLookup.js +30 -0
- package/es/elements/{AddElementDialog → ElementLookupDialog}/Manual/ManualForm.js +4 -2
- package/es/elements/{AddElementDialog → ElementLookupDialog}/getElement.d.ts +1 -0
- package/es/elements/{AddElementDialog → ElementLookupDialog}/getElement.js +1 -0
- package/es/elements/{AddElementDialog → ElementLookupDialog}/index.d.ts +5 -5
- package/es/elements/{AddElementDialog → ElementLookupDialog}/index.js +4 -1
- package/es/elements/ProjectSelect.js +9 -2
- package/es/elements/data/dsDamages.d.ts +1 -1
- package/es/elements/data/dsDamages.js +2 -2
- package/es/elements/data/dsElements.d.ts +2 -0
- package/es/elements/data/dsElements.js +11 -1
- package/es/elements/data/dsTransportElements.d.ts +10 -0
- package/es/elements/data/dsTransportElements.js +57 -0
- package/es/elements/data/index.d.ts +5 -1
- package/es/elements/data/index.js +5 -1
- package/es/elements/data/procDeleteAttachment.d.ts +2 -0
- package/es/elements/data/procDeleteAttachment.js +18 -0
- package/es/elements/data/procDeleteDamage.d.ts +2 -0
- package/es/elements/data/procDeleteDamage.js +18 -0
- package/es/elements/data/procRemoveDamageFix.d.ts +2 -0
- package/es/elements/data/procRemoveDamageFix.js +18 -0
- package/es/elements/data/procRestoreAttachments.d.ts +2 -0
- package/es/elements/data/procRestoreAttachments.js +18 -0
- package/es/elements/index.d.ts +8 -2
- package/es/elements/index.js +8 -2
- package/es/index.d.ts +1 -1
- package/es/index.js +1 -1
- package/package.json +4 -4
- package/src/components/FilePond.tsx +73 -26
- package/src/elements/ElementDamage/DamageFormButtons.tsx +35 -0
- package/src/elements/ElementDamage/DescriptionInput.tsx +111 -0
- package/src/elements/{ElementDamageForm/DuplicateDamage/DuplicateElementDamageDialog.tsx → ElementDamage/DuplicateDamage/DublicateElementDamageDialog.tsx} +24 -9
- package/src/elements/ElementDamage/DuplicateDamage/index.tsx +105 -0
- package/src/elements/ElementDamage/ElementNumberTextField.tsx +41 -0
- package/src/elements/ElementDamage/HiddenDamageFields.tsx +13 -0
- package/src/elements/ElementDamage/RegisterFix.tsx +100 -0
- package/src/elements/ElementDamage/SubmitButtons.tsx +40 -0
- package/src/elements/ElementDamage/TransportElementSelect.tsx +52 -0
- package/src/elements/ElementLookup.tsx +90 -0
- package/src/elements/{AddElementDialog → ElementLookupDialog}/Manual/ManualForm.tsx +5 -2
- package/src/elements/{AddElementDialog → ElementLookupDialog}/getElement.ts +2 -0
- package/src/elements/{AddElementDialog → ElementLookupDialog}/index.tsx +9 -5
- package/src/elements/ProjectSelect.tsx +13 -3
- package/src/elements/data/dsDamages.ts +3 -3
- package/src/elements/data/dsElements.ts +13 -1
- package/src/elements/data/dsTransportElements.ts +68 -0
- package/src/elements/data/index.ts +5 -1
- package/src/elements/data/procDeleteAttachment.ts +19 -0
- package/src/elements/data/procDeleteDamage.ts +19 -0
- package/src/elements/data/procRemoveDamageFix.ts +19 -0
- package/src/elements/data/procRestoreAttachments.ts +19 -0
- package/src/elements/index.ts +8 -3
- package/src/index.ts +1 -1
- package/es/elements/ElementDamageForm/DamageFormFields.d.ts +0 -12
- package/es/elements/ElementDamageForm/DamageFormFields.js +0 -39
- package/es/elements/ElementDamageForm/DuplicateDamage/DuplicateElementDamageDialog.js +0 -11
- package/es/elements/ElementDamageForm/index.d.ts +0 -13
- package/es/elements/ElementDamageForm/index.js +0 -219
- package/src/elements/ElementDamageForm/DamageFormFields.tsx +0 -149
- package/src/elements/ElementDamageForm/index.tsx +0 -397
- /package/es/elements/{ElementDamageForm → ElementDamage}/DuplicateDamage/DesktopView.d.ts +0 -0
- /package/es/elements/{ElementDamageForm → ElementDamage}/DuplicateDamage/DesktopView.js +0 -0
- /package/es/elements/{ElementDamageForm → ElementDamage}/DuplicateDamage/PhoneView.d.ts +0 -0
- /package/es/elements/{ElementDamageForm → ElementDamage}/DuplicateDamage/PhoneView.js +0 -0
- /package/es/elements/{ElementDamageForm → ElementDamage}/index.css +0 -0
- /package/es/elements/{AddElementDialog → ElementLookupDialog}/BarcodeScanner/DeadIcon.d.ts +0 -0
- /package/es/elements/{AddElementDialog → ElementLookupDialog}/BarcodeScanner/DeadIcon.js +0 -0
- /package/es/elements/{AddElementDialog → ElementLookupDialog}/BarcodeScanner/Error.d.ts +0 -0
- /package/es/elements/{AddElementDialog → ElementLookupDialog}/BarcodeScanner/Error.js +0 -0
- /package/es/elements/{AddElementDialog → ElementLookupDialog}/BarcodeScanner/index.d.ts +0 -0
- /package/es/elements/{AddElementDialog → ElementLookupDialog}/BarcodeScanner/index.js +0 -0
- /package/es/elements/{AddElementDialog → ElementLookupDialog}/BarcodeScanner/useScanner.d.ts +0 -0
- /package/es/elements/{AddElementDialog → ElementLookupDialog}/BarcodeScanner/useScanner.js +0 -0
- /package/es/elements/{AddElementDialog → ElementLookupDialog}/HIDScanner/index.css +0 -0
- /package/es/elements/{AddElementDialog → ElementLookupDialog}/HIDScanner/index.d.ts +0 -0
- /package/es/elements/{AddElementDialog → ElementLookupDialog}/HIDScanner/index.js +0 -0
- /package/es/elements/{AddElementDialog → ElementLookupDialog}/HIDScanner/useHIDScanner.d.ts +0 -0
- /package/es/elements/{AddElementDialog → ElementLookupDialog}/HIDScanner/useHIDScanner.js +0 -0
- /package/es/elements/{AddElementDialog → ElementLookupDialog}/Manual/ManualForm.d.ts +0 -0
- /package/es/elements/{AddElementDialog → ElementLookupDialog}/utils/Giai.d.ts +0 -0
- /package/es/elements/{AddElementDialog → ElementLookupDialog}/utils/Giai.js +0 -0
- /package/es/elements/{AddElementDialog → ElementLookupDialog}/utils/beep.d.ts +0 -0
- /package/es/elements/{AddElementDialog → ElementLookupDialog}/utils/beep.js +0 -0
- /package/src/elements/{ElementDamageForm → ElementDamage}/DuplicateDamage/DesktopView.tsx +0 -0
- /package/src/elements/{ElementDamageForm → ElementDamage}/DuplicateDamage/PhoneView.tsx +0 -0
- /package/src/elements/{ElementDamageForm → ElementDamage}/index.css +0 -0
- /package/src/elements/{AddElementDialog → ElementLookupDialog}/BarcodeScanner/DeadIcon.tsx +0 -0
- /package/src/elements/{AddElementDialog → ElementLookupDialog}/BarcodeScanner/Error.tsx +0 -0
- /package/src/elements/{AddElementDialog → ElementLookupDialog}/BarcodeScanner/index.tsx +0 -0
- /package/src/elements/{AddElementDialog → ElementLookupDialog}/BarcodeScanner/useScanner.ts +0 -0
- /package/src/elements/{AddElementDialog → ElementLookupDialog}/HIDScanner/index.css +0 -0
- /package/src/elements/{AddElementDialog → ElementLookupDialog}/HIDScanner/index.tsx +0 -0
- /package/src/elements/{AddElementDialog → ElementLookupDialog}/HIDScanner/useHIDScanner.ts +0 -0
- /package/src/elements/{AddElementDialog → ElementLookupDialog}/utils/Giai.ts +0 -0
- /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
|
-
}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
/package/es/elements/{AddElementDialog → ElementLookupDialog}/BarcodeScanner/useScanner.d.ts
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|