@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.
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 +4 -4
  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
@@ -23,26 +23,26 @@ export type AddElement = {
23
23
 
24
24
  type InitialTabProps = "camera" | "scanner" | "manual";
25
25
 
26
- export type AddElementDialogSharedProps = {
26
+ export type ElementLookupDialogSharedProps = {
27
27
  open: boolean;
28
28
  onClose: () => void;
29
29
  initialTab?: InitialTabProps | null;
30
30
  useSearch?: boolean;
31
31
  };
32
32
 
33
- export type AddElementDialogSingleModeProps = AddElementDialogSharedProps & {
33
+ export type ElementLookupDialogSingleModeProps = ElementLookupDialogSharedProps & {
34
34
  mode: "single" | "search";
35
35
  onAdd: (element: AddElement) => Promise<void>;
36
36
  };
37
37
 
38
- export type AddElementDialogMultiModeProps = AddElementDialogSharedProps & {
38
+ export type ElementLookupDialogMultiModeProps = ElementLookupDialogSharedProps & {
39
39
  mode: "multi";
40
40
  onAdd: (element: AddElement[]) => Promise<void>;
41
41
  };
42
42
 
43
- export type AddElementDialogProps = AddElementDialogSingleModeProps | AddElementDialogMultiModeProps;
43
+ export type ElementLookupDialogProps = ElementLookupDialogSingleModeProps | ElementLookupDialogMultiModeProps;
44
44
 
45
- export function AddElementDialog(props: AddElementDialogProps) {
45
+ export function ElementLookupDialog(props: ElementLookupDialogProps) {
46
46
  let { open, onClose, initialTab } = props;
47
47
  let [tab, setTab] = useState<"camera" | "scanner" | "manual">("camera");
48
48
  let [elements, setElements] = useState<Array<AddElement>>([]);
@@ -103,6 +103,10 @@ export function AddElementDialog(props: AddElementDialogProps) {
103
103
  }
104
104
  }
105
105
 
106
+ if (tab === "manual" && props.mode === "search") {
107
+ tab = "camera";
108
+ }
109
+
106
110
  return (
107
111
  <ResponsiveDialog
108
112
  open={open}
@@ -1,7 +1,7 @@
1
1
  import { Autocomplete, ListItem, ListItemText, type SxProps, TextField, type Theme } from "@mui/material";
2
2
  import { getLocalizedString } from "@olenbetong/appframe-core";
3
3
  import { useDataWithFilter, useDebounce } from "@olenbetong/appframe-react";
4
- import { useMemo, useState } from "react";
4
+ import { useMemo, useRef, useState } from "react";
5
5
  import { dsProjects, type ProjectsRecord } from "./data/dsProjects";
6
6
  import { dsReportProjects } from "./data/dsReportProjects";
7
7
 
@@ -47,7 +47,11 @@ export function ProjectSelect({
47
47
  search ? `[SearchColumn] LIKE '%${search}%'` : "",
48
48
  );
49
49
 
50
+ let highlightRef = useRef<Partial<ProjectsRecord | null>>(null);
51
+
50
52
  function handleSelect(value: Partial<ProjectsRecord> | null) {
53
+ highlightRef.current = null;
54
+
51
55
  if (!disabled && !readOnly) {
52
56
  if (onChange) {
53
57
  onChange(value);
@@ -73,6 +77,8 @@ export function ProjectSelect({
73
77
  <Autocomplete<Partial<ProjectsRecord>>
74
78
  sx={sx}
75
79
  autoHighlight
80
+ autoSelect
81
+ clearOnEscape
76
82
  className={className}
77
83
  options={projects}
78
84
  disabled={disabled}
@@ -80,7 +86,6 @@ export function ProjectSelect({
80
86
  option?.ProjectID !== undefined ? `${option.ProjectID}: ${option.ProjectName}` : ""
81
87
  }
82
88
  isOptionEqualToValue={(option, value) => option.Domain === value.Domain && option.ProjectID === value.ProjectID}
83
- clearOnEscape
84
89
  onChange={(_, value) => handleSelect(value)}
85
90
  onClose={() => setQuery("")}
86
91
  value={value !== undefined ? value : selected}
@@ -90,7 +95,12 @@ export function ProjectSelect({
90
95
  label={label ? label : getLocalizedString("Project ID")}
91
96
  id={id ?? "ProjectLookup"}
92
97
  fullWidth
93
- inputProps={{ readOnly, ...params.inputProps }}
98
+ slotProps={{
99
+ htmlInput: {
100
+ readOnly,
101
+ ...params.inputProps,
102
+ },
103
+ }}
94
104
  autoComplete="off"
95
105
  variant="filled"
96
106
  required={required}
@@ -32,8 +32,8 @@ export type DamagesRecord = {
32
32
  Action: string | null;
33
33
  RegisteredFix: Date | null;
34
34
  RegisteredFixBy: string | null;
35
+ RegisteredFixFullName: string | null;
35
36
  Cause: string | null;
36
- FullName: string | null;
37
37
  SearchColumn: string;
38
38
  ElementRef: string | null;
39
39
  };
@@ -138,12 +138,12 @@ export const dsDamages = generateApiDataObject<DamagesRecord>({
138
138
  nullable: true,
139
139
  },
140
140
  {
141
- name: "Cause",
141
+ name: "RegisteredFixFullName",
142
142
  type: "string",
143
143
  nullable: true,
144
144
  },
145
145
  {
146
- name: "FullName",
146
+ name: "Cause",
147
147
  type: "string",
148
148
  nullable: true,
149
149
  },
@@ -4,14 +4,16 @@ af resources generate aviw_Production_Elements_All \
4
4
  --id dsElements \
5
5
  --types \
6
6
  --max-records 100 \
7
- --fields PrimKey,ProjectID,ElementID
7
+ --fields PrimKey,ProjectID,ElementID,ProjectName,Name
8
8
  */
9
9
  import { generateApiDataObject } from "@olenbetong/appframe-data";
10
10
 
11
11
  export type ElementsRecord = {
12
12
  PrimKey: string;
13
13
  ProjectID: string;
14
+ ProjectName: string;
14
15
  ElementID: string | null;
16
+ Name: string | null;
15
17
  };
16
18
 
17
19
  export const dsElements = generateApiDataObject<ElementsRecord>({
@@ -32,11 +34,21 @@ export const dsElements = generateApiDataObject<ElementsRecord>({
32
34
  type: "string",
33
35
  nullable: false,
34
36
  },
37
+ {
38
+ name: "ProjectName",
39
+ type: "string",
40
+ nullable: false,
41
+ },
35
42
  {
36
43
  name: "ElementID",
37
44
  type: "string",
38
45
  nullable: true,
39
46
  },
47
+ {
48
+ name: "Name",
49
+ type: "string",
50
+ nullable: true,
51
+ },
40
52
  ],
41
53
  parameters: {
42
54
  maxRecords: 100,
@@ -0,0 +1,68 @@
1
+ /*
2
+ auto-generated by CLI:
3
+ af resources generate aviw_Fleet_DeliveryTickets_Elements \
4
+ --id dsTransportElements \
5
+ --types \
6
+ --max-records 100 \
7
+ --fields PrimKey,DeliveryTicketID,ProjectID,ProjectName,ElementID,Name,Domain
8
+ */
9
+ import { generateApiDataObject } from "@olenbetong/appframe-data";
10
+
11
+ export type TransportElementsRecord = {
12
+ PrimKey: string;
13
+ DeliveryTicketID: number;
14
+ Domain: string;
15
+ ProjectID: string;
16
+ ProjectName: string;
17
+ ElementID: string | null;
18
+ Name: string | null;
19
+ };
20
+
21
+ export const dsTransportElements = generateApiDataObject<TransportElementsRecord>({
22
+ resource: "aviw_Fleet_DeliveryTickets_Elements",
23
+ id: "dsTransportElements",
24
+ allowUpdate: false,
25
+ allowInsert: false,
26
+ allowDelete: false,
27
+ dynamicLoading: false,
28
+ fields: [
29
+ {
30
+ name: "PrimKey",
31
+ type: "string",
32
+ nullable: false,
33
+ },
34
+ {
35
+ name: "DeliveryTicketID",
36
+ type: "number",
37
+ nullable: false,
38
+ },
39
+ {
40
+ name: "Domain",
41
+ type: "string",
42
+ nullable: false,
43
+ },
44
+ {
45
+ name: "ProjectID",
46
+ type: "string",
47
+ nullable: false,
48
+ },
49
+ {
50
+ name: "ProjectName",
51
+ type: "string",
52
+ nullable: false,
53
+ },
54
+ {
55
+ name: "ElementID",
56
+ type: "string",
57
+ nullable: true,
58
+ },
59
+ {
60
+ name: "Name",
61
+ type: "string",
62
+ nullable: true,
63
+ },
64
+ ],
65
+ parameters: {
66
+ maxRecords: 100,
67
+ },
68
+ });
@@ -3,5 +3,9 @@ export * from "./dsCurrentAttachment.js";
3
3
  export * from "./dsDamages.js";
4
4
  export * from "./dsDamagesDuplicateCheck.js";
5
5
  export * from "./dsElements.js";
6
- export * from "./procApproveDamage.js";
7
6
  export * from "./dsProjects.js";
7
+ export * from "./procApproveDamage.js";
8
+ export * from "./procDeleteAttachment.js";
9
+ export * from "./procDeleteDamage.js";
10
+ export * from "./procRemoveDamageFix.js";
11
+ export * from "./procRestoreAttachments.js";
@@ -0,0 +1,19 @@
1
+ /*
2
+ auto-generated by CLI:
3
+ af resources generate astp_Production_ElementsDamages_DeleteAttachments \
4
+ --id procDeleteAttachment
5
+ */
6
+ import { ProcedureAPI } from "@olenbetong/appframe-data";
7
+
8
+ export const procDeleteAttachment = new ProcedureAPI({
9
+ procedureId: "astp_Production_ElementsDamages_DeleteAttachments",
10
+ parameters: [
11
+ {
12
+ name: "PrimKeyList",
13
+ type: "string",
14
+ hasDefault: false,
15
+ required: false,
16
+ },
17
+ ],
18
+ timeout: 30000,
19
+ });
@@ -0,0 +1,19 @@
1
+ /*
2
+ auto-generated by CLI:
3
+ af resources generate astp_Production_ElementsDamages_Delete \
4
+ --id procDeleteDamage
5
+ */
6
+ import { ProcedureAPI } from "@olenbetong/appframe-data";
7
+
8
+ export const procDeleteDamage = new ProcedureAPI({
9
+ procedureId: "astp_Production_ElementsDamages_Delete",
10
+ parameters: [
11
+ {
12
+ name: "ID",
13
+ type: "number",
14
+ hasDefault: false,
15
+ required: false,
16
+ },
17
+ ],
18
+ timeout: 30000,
19
+ });
@@ -0,0 +1,19 @@
1
+ /*
2
+ auto-generated by CLI:
3
+ af resources generate astp_Production_ElementsDamages_RemoveFix \
4
+ --id procRemoveDamageFix
5
+ */
6
+ import { ProcedureAPI } from "@olenbetong/appframe-data";
7
+
8
+ export const procRemoveDamageFix = new ProcedureAPI({
9
+ procedureId: "astp_Production_ElementsDamages_RemoveFix",
10
+ parameters: [
11
+ {
12
+ name: "ID",
13
+ type: "number",
14
+ hasDefault: false,
15
+ required: false,
16
+ },
17
+ ],
18
+ timeout: 30000,
19
+ });
@@ -0,0 +1,19 @@
1
+ /*
2
+ auto-generated by CLI:
3
+ af resources generate astp_Production_ElementsDamages_RestoreAttachments \
4
+ --id procRestoreAttachments
5
+ */
6
+ import { ProcedureAPI } from "@olenbetong/appframe-data";
7
+
8
+ export const procRestoreAttachments = new ProcedureAPI({
9
+ procedureId: "astp_Production_ElementsDamages_RestoreAttachments",
10
+ parameters: [
11
+ {
12
+ name: "PrimKeyList",
13
+ type: "string",
14
+ hasDefault: false,
15
+ required: false,
16
+ },
17
+ ],
18
+ timeout: 30000,
19
+ });
@@ -1,4 +1,9 @@
1
1
  export * from "./data/index.js";
2
-
3
- export * from "./AddElementDialog/index.js";
4
- export * from "./ElementDamageForm/index.js";
2
+ export * from "./ElementDamage/DescriptionInput.js";
3
+ export * from "./ElementDamage/DuplicateDamage/index.js";
4
+ export * from "./ElementDamage/ElementNumberTextField.js";
5
+ export * from "./ElementDamage/HiddenDamageFields.js";
6
+ export * from "./ElementDamage/RegisterFix.js";
7
+ export * from "./ElementDamage/SubmitButtons.js";
8
+ export * from "./ElementLookup.js";
9
+ export * from "./ElementLookupDialog/index.js";
package/src/index.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  export { Checkbox, type CheckboxProps } from "./components/Checkbox/index.js";
2
2
  export { CardColumn, CardDetail, CardLabel, CardStep, CardStepList, ColorCard } from "./components/ColorCard/index.js";
3
3
  export { DateNavigator } from "./components/DateNavigator/index.js";
4
+ export * from "./components/FilePond.js";
4
5
  export { Card, LinkedList, LinkedListItem } from "./components/LinkedCardList/index.js";
5
6
  export {
6
7
  BannerImage as PageBannerImage,
@@ -20,5 +21,4 @@ export { Sidebar, type SidebarProps } from "./components/Sidebar/index.js";
20
21
  export { Spinner, type SpinnerProps } from "./components/Spinner/index.js";
21
22
  export { SplitContainer, type SplitContainerProps } from "./components/SplitContainer/index.js";
22
23
  export { ValueToggleGroup, type ValueToggleGroupProps } from "./components/ValueToggleGroup/index.js";
23
- export { ElementDamageForm } from "./elements/ElementDamageForm/index.js";
24
24
  export { useTranslation } from "./useTranslation/index.js";
@@ -1,12 +0,0 @@
1
- import type { DamagesRecord, ElementsRecord, ProjectsRecord } from "../data";
2
- type DamageFormFieldsProps = {
3
- editRecord: DamagesRecord | null;
4
- project: Partial<ProjectsRecord> | null;
5
- elementRecord: ElementsRecord[];
6
- elementID: string;
7
- attachmentPrimKeys: string[];
8
- handleAddElement: () => void;
9
- formName: string;
10
- };
11
- export declare function DamageFormFields({ editRecord, project, elementRecord, elementID, attachmentPrimKeys, handleAddElement, formName, }: DamageFormFieldsProps): import("react/jsx-runtime").JSX.Element;
12
- export {};
@@ -1,39 +0,0 @@
1
- import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
- import AddAPhotoIcon from "@mui/icons-material/AddAPhoto";
3
- import { Autocomplete, Box, Button, TextField } from "@mui/material";
4
- import { getLocalizedString } from "@olenbetong/appframe-core";
5
- import { useState } from "react";
6
- export function DamageFormFields({ editRecord, project, elementRecord, elementID, attachmentPrimKeys, handleAddElement, formName, }) {
7
- let [description, setDescription] = useState();
8
- function handleCopyPreviousDamage() {
9
- const form = document.forms.namedItem(formName);
10
- if (form) {
11
- form["Cause"].value = localStorage.getItem("ElementDamage_Cause")?.toString();
12
- form["Action"].value = localStorage.getItem("ElementDamage_Action")?.toString();
13
- }
14
- setDescription(localStorage.getItem("ElementDamage_Description")?.toString());
15
- }
16
- return (_jsxs(_Fragment, { children: [_jsx("input", { type: "hidden", name: "ID", value: editRecord?.ID ?? "" }), _jsx("input", { type: "hidden", name: "PrimKey", value: editRecord?.PrimKey ?? "" }), _jsx("input", { type: "hidden", name: "ProjectID", value: project?.ProjectID ?? "" }), _jsx("input", { type: "hidden", name: "Domain", value: project?.Domain ?? "" }), _jsx("input", { type: "hidden", name: "ElementRef", value: elementRecord[0]?.PrimKey ?? "" }), _jsx("input", { type: "hidden", name: "AttachmentPrimkeys", value: attachmentPrimKeys }), _jsx(TextField, { name: "Date", type: "date", defaultValue: (editRecord?.Date ?? new Date()).toISOString().split("T")[0], id: "NewElementDamage_Date", label: getLocalizedString("Date"), fullWidth: true, required: true, slotProps: { inputLabel: { shrink: true } } }), _jsxs(Box, { display: "flex", gap: 2, justifyContent: "flex-end", children: [_jsx(Button, { variant: "contained", onClick: () => handleCopyPreviousDamage(), disabled: !localStorage.getItem("ElementDamage_Description"), children: getLocalizedString("Copy previous damage") }), _jsx(Button, { onClick: handleAddElement, endIcon: _jsx(AddAPhotoIcon, {}), variant: "contained", children: getLocalizedString("Add element") })] }), _jsx(TextField, { id: "NewElementDamage_Project", value: project ? `${project?.ProjectID}: ${project?.ProjectName}` : "", label: getLocalizedString("Project"), fullWidth: true, required: true, autoComplete: "off", slotProps: {
17
- htmlInput: { readOnly: true },
18
- } }), _jsx(TextField, { name: "ElementID", id: "NewElementDamage_ElementID", value: elementID, label: getLocalizedString("Element ID"), fullWidth: true, autoComplete: "off", slotProps: {
19
- htmlInput: { readOnly: true },
20
- } }), _jsx(TextField, { name: "ElementNumber", id: "NewElementDamage_ElementNr", defaultValue: editRecord?.ElementNumber ?? "", label: getLocalizedString("Element number"), fullWidth: true, autoComplete: "off", disabled: !!elementID }), _jsx(Autocomplete, { value: description ?? editRecord?.Description ?? "", options: [
21
- getLocalizedString("Tear in element"),
22
- getLocalizedString("Damage around lifting anchor"),
23
- getLocalizedString("Damage on underside"),
24
- ], freeSolo: true, renderInput: (params) => (_jsx(TextField, { name: "Description", required: true, ...params, label: getLocalizedString("Description") })) }), _jsx(TextField, { name: "Cause", id: "NewElementDamage_Cause", defaultValue: editRecord?.Cause ?? "", label: getLocalizedString("Cause"), fullWidth: true, slotProps: {
25
- inputLabel: {
26
- shrink: (() => {
27
- const form = document.forms.namedItem(formName);
28
- return form?.["Cause"]?.value ? true : undefined;
29
- })(),
30
- },
31
- } }), _jsx(TextField, { name: "Action", id: "NewElementDamage_Action", defaultValue: editRecord?.Action ?? "", label: getLocalizedString("Action"), fullWidth: true, slotProps: {
32
- inputLabel: {
33
- shrink: (() => {
34
- const form = document.forms.namedItem(formName);
35
- return form?.["Action"]?.value ? true : undefined;
36
- })(),
37
- },
38
- } })] }));
39
- }
@@ -1,11 +0,0 @@
1
- import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
- import Add from "@mui/icons-material/Add";
3
- import { Button, Dialog, DialogActions, DialogContent, DialogTitle, Grid, useMediaQuery } from "@mui/material";
4
- import { getLocalizedString } from "@olenbetong/appframe-core";
5
- import { theme } from "@olenbetong/appframe-mui";
6
- import { ElementDamagesHeader, ElementDamagesItem } from "./DesktopView";
7
- import { DuplicatePhoneViewItem } from "./PhoneView";
8
- export function DuplicateElementDamageDialog({ open, onClose, record, fallBack }) {
9
- let matches = useMediaQuery(theme.breakpoints.up("lg"));
10
- return (_jsxs(Dialog, { open: open, onClose: () => onClose(false), fullWidth: true, fullScreen: !matches, children: [_jsx(DialogTitle, { sx: { backgroundColor: "#e9ebee" }, children: getLocalizedString("This element has one or more unfixed registered damage") }), _jsx(DialogContent, { sx: { backgroundColor: "#e9ebee" }, children: _jsx(Grid, { container: true, children: matches ? (_jsxs(_Fragment, { children: [_jsx(ElementDamagesHeader, {}), record.map((record) => (_jsx(ElementDamagesItem, { record: record }, record.PrimKey)))] })) : (_jsx("div", { className: "flow", style: { width: "100%" }, children: record.map((record) => (_jsx(DuplicatePhoneViewItem, { record: record }, record.PrimKey))) })) }) }), _jsxs(DialogActions, { sx: { backgroundColor: "#e9ebee" }, children: [_jsx(Button, { onClick: fallBack, children: getLocalizedString("Cancel") }), _jsx(Button, { startIcon: _jsx(Add, {}), variant: "contained", type: "submit", children: getLocalizedString("Register damage anyway") })] })] }));
11
- }
@@ -1,13 +0,0 @@
1
- import "./index.css";
2
- import { type DataObject } from "@olenbetong/appframe-data";
3
- import { type AttachmentsRecord, type CurrentAttachmentRecord, type DamagesRecord, type ElementsRecord } from "../data";
4
- type ElementDamageFormProps = {
5
- editRecord: DamagesRecord | null;
6
- elementsDataObject: DataObject<ElementsRecord>;
7
- damagesDataObject: DataObject<DamagesRecord>;
8
- attachmentsDataObject: DataObject<AttachmentsRecord>;
9
- currentAttachmentDataObject: DataObject<CurrentAttachmentRecord>;
10
- fallBack: () => void;
11
- };
12
- export declare function ElementDamageForm({ editRecord, elementsDataObject, damagesDataObject, attachmentsDataObject, currentAttachmentDataObject, fallBack, }: ElementDamageFormProps): import("react/jsx-runtime").JSX.Element;
13
- export {};
@@ -1,219 +0,0 @@
1
- import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
- import "./index.css";
3
- import Add from "@mui/icons-material/Add";
4
- import CheckIcon from "@mui/icons-material/Check";
5
- import { Box, Button, Checkbox, FormControlLabel, Typography } from "@mui/material";
6
- import Alert from "@mui/material/Alert";
7
- import { getLocalizedString, localize } from "@olenbetong/appframe-core";
8
- import { formDataToDataObjectRecord } from "@olenbetong/appframe-data";
9
- import { PageContainer, PageTitle } from "@olenbetong/appframe-mui";
10
- import { useDataWithFilter } from "@olenbetong/appframe-react";
11
- import { useId, useRef, useState } from "react";
12
- import { FilePond } from "../../components/FilePond";
13
- import { AddElementDialog } from "../AddElementDialog";
14
- import { dsDamagesDuplicateCheck, procApproveDamage, } from "../data";
15
- import { DamageFormFields } from "./DamageFormFields";
16
- import { DuplicateElementDamageDialog } from "./DuplicateDamage/DuplicateElementDamageDialog";
17
- const formatter = new Intl.DateTimeFormat(af.userSession.culture, {
18
- day: "numeric",
19
- month: "long",
20
- year: "numeric",
21
- hour: "2-digit",
22
- minute: "2-digit",
23
- timeZone: "UTC",
24
- });
25
- function deleteAttachments(dataObject, primKeyArray) {
26
- for (const primKey of primKeyArray) {
27
- const index = dataObject.findIndex((record) => record.PrimKey === primKey);
28
- if (index > -1) {
29
- dataObject.deleteRow(index);
30
- }
31
- }
32
- }
33
- function RegisterFix({ editRecord, damageDataObject, fixedThisSession, setFixedThisSession }) {
34
- const [loading, setLoading] = useState(false);
35
- async function handleRegisterFix() {
36
- try {
37
- if (confirm(getLocalizedString("Are you sure you want to register a fix for this damage?"))) {
38
- setLoading(true);
39
- await procApproveDamage.execute({ ID: editRecord?.ID });
40
- await damageDataObject.refreshCurrentRow();
41
- setLoading(false);
42
- setFixedThisSession(true);
43
- }
44
- }
45
- catch (error) {
46
- alert(error.message);
47
- }
48
- }
49
- return (_jsxs(_Fragment, { children: [editRecord ? (_jsx(Box, { display: "flex", justifyContent: "flex-end", children: _jsx(Button, { loading: loading, loadingPosition: "end", endIcon: _jsx(CheckIcon, {}), onClick: handleRegisterFix, disabled: !!editRecord.RegisteredFix || fixedThisSession, variant: "contained", children: getLocalizedString("Register fix") }) })) : (_jsx(FormControlLabel, { control: _jsx(Checkbox, {}), label: getLocalizedString("Register fixed"), name: "RegisteredFix", id: "NewElementDamage_RegisteredFix" })), editRecord?.RegisteredFix && (_jsx(Typography, { mb: 1.5, color: "text.secondary", children: localize `Registered fix by ${editRecord.FullName ?? editRecord.RegisteredFixBy} on the ${formatter.format(editRecord.RegisteredFix)}` }))] }));
50
- }
51
- export function ElementDamageForm({ editRecord, elementsDataObject, damagesDataObject, attachmentsDataObject, currentAttachmentDataObject, fallBack, }) {
52
- let formName = useId();
53
- let formRef = useRef(null);
54
- // Data object values
55
- let [project, setProject] = useState(editRecord
56
- ? { ProjectID: editRecord.ProjectID, ProjectName: editRecord.ProjectName, Domain: editRecord.Domain }
57
- : null);
58
- let [elementID, setElementID] = useState(editRecord?.ElementID ?? "");
59
- let [attachmentPrimKeys, setAttachmentPrimKeys] = useState([]);
60
- let [duplicateRecords, setDuplicateRecords] = useState([]);
61
- let damagesDuplicateRecord = useDataWithFilter(dsDamagesDuplicateCheck, "1=1", "whereClause");
62
- let elementRecord = useDataWithFilter(elementsDataObject, `ProjectID = '${project?.ProjectID}' AND ElementID = '${elementID}'`, "whereClause");
63
- // Event values
64
- let [addElementOpen, setAddElementOpen] = useState(!editRecord); // Opens by default when form is new
65
- let [loading, setLoading] = useState(false);
66
- let [uploadingFile, setUploadingFile] = useState(false);
67
- let [fixedThisSession, setFixedThisSession] = useState(false); // Element is registered fixed during this editing session
68
- let [duplicateDialog, setDuplicateDialog] = useState(false);
69
- // Error values
70
- let [error, setError] = useState(null);
71
- async function handleAddElement(addElement) {
72
- setProject({
73
- ProjectID: addElement.element.ProjectID,
74
- ProjectName: addElement.element.ProjectName,
75
- Domain: addElement.element.ProjectDomain,
76
- });
77
- setElementID(addElement.element.ElementID);
78
- }
79
- async function handleDelete(row) {
80
- try {
81
- let index = damagesDataObject.findIndex((r) => r.PrimKey === row.PrimKey);
82
- if (index >= 0 && confirm(getLocalizedString("Are you sure you want to delete this item?"))) {
83
- let primKeyArray = currentAttachmentDataObject.map((record) => record.PrimKey);
84
- deleteAttachments(currentAttachmentDataObject, primKeyArray);
85
- await damagesDataObject.deleteRow(index);
86
- }
87
- fallBack();
88
- }
89
- catch (error) {
90
- setError(error.message);
91
- }
92
- }
93
- async function handleCancel() {
94
- // Remove the registered fix if it was registered this session
95
- if (editRecord && fixedThisSession) {
96
- damagesDataObject.setCurrentIndex(damagesDataObject.findIndex((record) => record.ID === editRecord.ID));
97
- await damagesDataObject.refreshCurrentRow();
98
- await damagesDataObject.save({
99
- RegisteredFix: null,
100
- RegisteredFixBy: null,
101
- });
102
- }
103
- // Remove attachments if they are not saved
104
- if (attachmentPrimKeys) {
105
- await attachmentsDataObject.refreshDataSource();
106
- const primKeyArray = attachmentPrimKeys.toString().split(",");
107
- deleteAttachments(attachmentsDataObject, primKeyArray);
108
- }
109
- fallBack();
110
- }
111
- // Returning true means a duplicate is found and confirmation dialog will open
112
- function isDuplicate() {
113
- // If we are editing a record, we don't need to check for duplicates
114
- if (editRecord) {
115
- return false;
116
- }
117
- const filteredRecord = damagesDuplicateRecord.filter((record) => record.ElementID === elementID && record.ProjectID === project?.ProjectID && !record.RegisteredFix);
118
- if (filteredRecord.length > 0) {
119
- setDuplicateRecords(filteredRecord);
120
- setDuplicateDialog(true);
121
- return true;
122
- }
123
- return false;
124
- }
125
- async function handleSubmit(event) {
126
- event.preventDefault();
127
- setLoading(true);
128
- if (duplicateRecords.length <= 0) {
129
- if (isDuplicate()) {
130
- return;
131
- }
132
- }
133
- try {
134
- let formData = new FormData(event.currentTarget);
135
- let attachmentPrimKeys = formData.get("AttachmentPrimkeys");
136
- let elementID = formData.get("ElementID");
137
- let elementNumber = formData.get("ElementNumber");
138
- formData.delete("File");
139
- formData.delete("AttachmentPrimkeys");
140
- if (!elementID && !elementNumber) {
141
- setError(getLocalizedString("Please fill in either Element ID or Element Number"));
142
- return;
143
- }
144
- localStorage.setItem("ElementDamage_Description", formData.get("Description")?.toString() ?? "");
145
- localStorage.setItem("ElementDamage_Cause", formData.get("Cause")?.toString() ?? "");
146
- localStorage.setItem("ElementDamage_Action", formData.get("Action")?.toString() ?? "");
147
- let record = Object.assign({ ...formDataToDataObjectRecord(formData, damagesDataObject) });
148
- if (formData.get("ID")) {
149
- record.ID = undefined;
150
- await damagesDataObject.dataHandler.update(record);
151
- submitReturn();
152
- return;
153
- }
154
- else {
155
- damagesDataObject.setCurrentIndex(-1);
156
- // If the RegisteredFix Control Label is checked then it will exist in the record object
157
- let newJob;
158
- if ("RegisteredFix" in record) {
159
- newJob = await damagesDataObject.save({
160
- ...record,
161
- RegisteredFix: new Date(),
162
- RegisteredFixBy: af.userSession.login,
163
- });
164
- }
165
- else {
166
- newJob = await damagesDataObject.save(record);
167
- }
168
- await new Promise((res) => setTimeout(res, 1500));
169
- if (newJob) {
170
- // Update ElementDamageID in attachments table
171
- if (attachmentPrimKeys) {
172
- await attachmentsDataObject.refreshDataSource();
173
- const primKeyArray = attachmentPrimKeys.toString().split(",");
174
- for (const primKey of primKeyArray) {
175
- attachmentsDataObject.setCurrentIndex(attachmentsDataObject.findIndex((record) => record.PrimKey === primKey));
176
- if (attachmentsDataObject.getCurrentIndex() > -1) {
177
- await attachmentsDataObject.save({
178
- DamageID: newJob.ID,
179
- ElementRef: newJob.ElementRef,
180
- ProjectID: newJob.ProjectID,
181
- ElementID: newJob.ElementID,
182
- ElementNumber: newJob.ElementNumber,
183
- Domain: formData.get("Domain")?.toString() ?? af.userSession.domain,
184
- Damage: true,
185
- });
186
- }
187
- }
188
- }
189
- submitReturn();
190
- return;
191
- }
192
- else {
193
- setError(getLocalizedString("No job returned when creating new job."));
194
- return;
195
- }
196
- }
197
- }
198
- catch (error) {
199
- submitReturn(error.message);
200
- return;
201
- }
202
- }
203
- function submitReturn(error) {
204
- if (!error) {
205
- fallBack();
206
- }
207
- else {
208
- setError(error);
209
- }
210
- setLoading(false);
211
- }
212
- return (_jsxs(PageContainer, { maxWidth: "sm", children: [_jsx(PageTitle, { variant: "h1", gutterBottom: true, children: getLocalizedString("New element damage") }), _jsx(AddElementDialog, { open: addElementOpen, mode: "single", onClose: () => setAddElementOpen(false), onAdd: handleAddElement }), _jsxs("form", { name: formName, ref: formRef, method: "POST", onSubmit: handleSubmit, className: "flow", children: [_jsx(DuplicateElementDamageDialog, { open: duplicateDialog, onClose: setDuplicateDialog, record: duplicateRecords, fallBack: fallBack }), error && (_jsx(Alert, { severity: "error", variant: "filled", children: error })), _jsx(DamageFormFields, { editRecord: editRecord, project: project, elementRecord: elementRecord, attachmentPrimKeys: [], elementID: elementID, formName: formName, handleAddElement: () => setAddElementOpen(true) }), _jsxs(Box, { display: "flex", flexDirection: "column", children: [_jsx(Typography, { variant: "h3", children: getLocalizedString("Pictures") }), _jsx(FilePond, { multiple: true, dataObject: currentAttachmentDataObject, fields: {
213
- DamageID: editRecord?.ID,
214
- ElementID: editRecord?.ElementID,
215
- ProjectID: editRecord?.ProjectID,
216
- ElementRef: editRecord?.ElementRef,
217
- Damage: true,
218
- }, onFileStart: () => editRecord ?? setUploadingFile(true), onFileProcessed: (_error, file) => setAttachmentPrimKeys([...attachmentPrimKeys, file.serverId]), onFilesProcessed: () => setUploadingFile(false), onError: () => setUploadingFile(false) })] }), _jsx(RegisterFix, { editRecord: editRecord, damageDataObject: damagesDataObject, fixedThisSession: fixedThisSession, setFixedThisSession: setFixedThisSession }), _jsxs(Box, { display: "flex", flexWrap: "wrap", gap: 2, justifyContent: "flex-end", children: [editRecord && _jsx(Button, { onClick: () => handleDelete(editRecord), children: getLocalizedString("Delete") }), _jsx(Button, { onClick: handleCancel, children: getLocalizedString("Cancel") }), _jsx(Button, { loading: loading || uploadingFile, loadingPosition: "start", startIcon: _jsx(Add, {}), type: "submit", variant: "contained", children: editRecord ? getLocalizedString("Save changes") : getLocalizedString("Register damage") })] })] })] }));
219
- }