@solidstarters/solid-core-ui 1.1.25 → 1.1.26

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 (128) hide show
  1. package/dist/components/common/SolidBreadcrumb.d.ts +1 -2
  2. package/dist/components/common/SolidBreadcrumb.d.ts.map +1 -1
  3. package/dist/components/common/SolidBreadcrumb.js +14 -9
  4. package/dist/components/common/SolidBreadcrumb.js.map +1 -1
  5. package/dist/components/core/form/SolidFormView.d.ts.map +1 -1
  6. package/dist/components/core/form/SolidFormView.js +65 -38
  7. package/dist/components/core/form/SolidFormView.js.map +1 -1
  8. package/dist/components/core/form/fields/SolidBooleanField.d.ts.map +1 -1
  9. package/dist/components/core/form/fields/SolidBooleanField.js +2 -2
  10. package/dist/components/core/form/fields/SolidBooleanField.js.map +1 -1
  11. package/dist/components/core/form/fields/SolidDateField.d.ts.map +1 -1
  12. package/dist/components/core/form/fields/SolidDateField.js +2 -2
  13. package/dist/components/core/form/fields/SolidDateField.js.map +1 -1
  14. package/dist/components/core/form/fields/SolidDateTimeField.d.ts.map +1 -1
  15. package/dist/components/core/form/fields/SolidDateTimeField.js +2 -2
  16. package/dist/components/core/form/fields/SolidDateTimeField.js.map +1 -1
  17. package/dist/components/core/form/fields/SolidDecimalField.d.ts.map +1 -1
  18. package/dist/components/core/form/fields/SolidDecimalField.js +2 -2
  19. package/dist/components/core/form/fields/SolidDecimalField.js.map +1 -1
  20. package/dist/components/core/form/fields/SolidIntegerField.d.ts.map +1 -1
  21. package/dist/components/core/form/fields/SolidIntegerField.js +2 -2
  22. package/dist/components/core/form/fields/SolidIntegerField.js.map +1 -1
  23. package/dist/components/core/form/fields/SolidJsonField.d.ts.map +1 -1
  24. package/dist/components/core/form/fields/SolidJsonField.js +1 -1
  25. package/dist/components/core/form/fields/SolidJsonField.js.map +1 -1
  26. package/dist/components/core/form/fields/SolidLongTextField.d.ts.map +1 -1
  27. package/dist/components/core/form/fields/SolidLongTextField.js +1 -1
  28. package/dist/components/core/form/fields/SolidLongTextField.js.map +1 -1
  29. package/dist/components/core/form/fields/SolidMediaMultipleField.d.ts.map +1 -1
  30. package/dist/components/core/form/fields/SolidMediaMultipleField.js +27 -96
  31. package/dist/components/core/form/fields/SolidMediaMultipleField.js.map +1 -1
  32. package/dist/components/core/form/fields/SolidMediaSingleField.d.ts.map +1 -1
  33. package/dist/components/core/form/fields/SolidMediaSingleField.js +29 -29
  34. package/dist/components/core/form/fields/SolidMediaSingleField.js.map +1 -1
  35. package/dist/components/core/form/fields/SolidRichTextField.d.ts.map +1 -1
  36. package/dist/components/core/form/fields/SolidRichTextField.js +1 -1
  37. package/dist/components/core/form/fields/SolidRichTextField.js.map +1 -1
  38. package/dist/components/core/form/fields/SolidSelectionDynamicField.d.ts.map +1 -1
  39. package/dist/components/core/form/fields/SolidSelectionDynamicField.js +2 -2
  40. package/dist/components/core/form/fields/SolidSelectionDynamicField.js.map +1 -1
  41. package/dist/components/core/form/fields/SolidSelectionStaticField.d.ts.map +1 -1
  42. package/dist/components/core/form/fields/SolidSelectionStaticField.js +2 -2
  43. package/dist/components/core/form/fields/SolidSelectionStaticField.js.map +1 -1
  44. package/dist/components/core/form/fields/SolidShortTextField.d.ts.map +1 -1
  45. package/dist/components/core/form/fields/SolidShortTextField.js +3 -3
  46. package/dist/components/core/form/fields/SolidShortTextField.js.map +1 -1
  47. package/dist/components/core/form/fields/SolidTimeField.d.ts.map +1 -1
  48. package/dist/components/core/form/fields/SolidTimeField.js +2 -2
  49. package/dist/components/core/form/fields/SolidTimeField.js.map +1 -1
  50. package/dist/components/core/form/fields/relations/SolidRelationManyToManyField.d.ts.map +1 -1
  51. package/dist/components/core/form/fields/relations/SolidRelationManyToManyField.js +5 -5
  52. package/dist/components/core/form/fields/relations/SolidRelationManyToManyField.js.map +1 -1
  53. package/dist/components/core/form/fields/relations/SolidRelationManyToOneField.d.ts.map +1 -1
  54. package/dist/components/core/form/fields/relations/SolidRelationManyToOneField.js +3 -3
  55. package/dist/components/core/form/fields/relations/SolidRelationManyToOneField.js.map +1 -1
  56. package/dist/components/core/form/fields/relations/SolidRelationOneToManyField.d.ts.map +1 -1
  57. package/dist/components/core/form/fields/relations/SolidRelationOneToManyField.js +1 -1
  58. package/dist/components/core/form/fields/relations/SolidRelationOneToManyField.js.map +1 -1
  59. package/dist/components/core/list/SolidTableRowCell.d.ts +6 -0
  60. package/dist/components/core/list/SolidTableRowCell.d.ts.map +1 -0
  61. package/dist/components/core/list/SolidTableRowCell.js +7 -0
  62. package/dist/components/core/list/SolidTableRowCell.js.map +1 -0
  63. package/dist/components/core/list/columns/SolidDateColumn.d.ts.map +1 -1
  64. package/dist/components/core/list/columns/SolidDateColumn.js +7 -3
  65. package/dist/components/core/list/columns/SolidDateColumn.js.map +1 -1
  66. package/dist/components/core/list/columns/SolidDatetimeColumn.d.ts.map +1 -1
  67. package/dist/components/core/list/columns/SolidDatetimeColumn.js +7 -3
  68. package/dist/components/core/list/columns/SolidDatetimeColumn.js.map +1 -1
  69. package/dist/components/core/list/columns/SolidExternalIdColumn.d.ts.map +1 -1
  70. package/dist/components/core/list/columns/SolidExternalIdColumn.js +7 -3
  71. package/dist/components/core/list/columns/SolidExternalIdColumn.js.map +1 -1
  72. package/dist/components/core/list/columns/SolidIdColumn.d.ts.map +1 -1
  73. package/dist/components/core/list/columns/SolidIdColumn.js +7 -3
  74. package/dist/components/core/list/columns/SolidIdColumn.js.map +1 -1
  75. package/dist/components/core/list/columns/SolidIntColumn.d.ts.map +1 -1
  76. package/dist/components/core/list/columns/SolidIntColumn.js +7 -3
  77. package/dist/components/core/list/columns/SolidIntColumn.js.map +1 -1
  78. package/dist/components/core/list/columns/SolidSelectionDynamicColumn.d.ts.map +1 -1
  79. package/dist/components/core/list/columns/SolidSelectionDynamicColumn.js +7 -3
  80. package/dist/components/core/list/columns/SolidSelectionDynamicColumn.js.map +1 -1
  81. package/dist/components/core/list/columns/SolidSelectionStaticColumn.d.ts.map +1 -1
  82. package/dist/components/core/list/columns/SolidSelectionStaticColumn.js +7 -3
  83. package/dist/components/core/list/columns/SolidSelectionStaticColumn.js.map +1 -1
  84. package/dist/components/core/list/columns/SolidShortTextColumn.d.ts.map +1 -1
  85. package/dist/components/core/list/columns/SolidShortTextColumn.js +7 -5
  86. package/dist/components/core/list/columns/SolidShortTextColumn.js.map +1 -1
  87. package/dist/components/core/list/columns/SolidTimeColumn.d.ts.map +1 -1
  88. package/dist/components/core/list/columns/SolidTimeColumn.js +7 -3
  89. package/dist/components/core/list/columns/SolidTimeColumn.js.map +1 -1
  90. package/dist/components/core/list/columns/SolidUuidColumn.d.ts.map +1 -1
  91. package/dist/components/core/list/columns/SolidUuidColumn.js +10 -4
  92. package/dist/components/core/list/columns/SolidUuidColumn.js.map +1 -1
  93. package/dist/components/core/model/ModelMetaData.js +5 -5
  94. package/dist/components/core/model/ModelMetaData.js.map +1 -1
  95. package/dist/resources/globals.css +2 -1
  96. package/package.json +1 -1
  97. package/src/components/common/SolidBreadcrumb.tsx +18 -15
  98. package/src/components/core/form/SolidFormView.tsx +20 -3
  99. package/src/components/core/form/fields/SolidBooleanField.tsx +4 -1
  100. package/src/components/core/form/fields/SolidDateField.tsx +4 -1
  101. package/src/components/core/form/fields/SolidDateTimeField.tsx +4 -1
  102. package/src/components/core/form/fields/SolidDecimalField.tsx +6 -3
  103. package/src/components/core/form/fields/SolidIntegerField.tsx +4 -1
  104. package/src/components/core/form/fields/SolidJsonField.tsx +5 -3
  105. package/src/components/core/form/fields/SolidLongTextField.tsx +4 -1
  106. package/src/components/core/form/fields/SolidMediaMultipleField.tsx +33 -118
  107. package/src/components/core/form/fields/SolidMediaSingleField.tsx +39 -33
  108. package/src/components/core/form/fields/SolidRichTextField.tsx +4 -1
  109. package/src/components/core/form/fields/SolidSelectionDynamicField.tsx +4 -1
  110. package/src/components/core/form/fields/SolidSelectionStaticField.tsx +4 -1
  111. package/src/components/core/form/fields/SolidShortTextField.tsx +5 -4
  112. package/src/components/core/form/fields/SolidTimeField.tsx +5 -3
  113. package/src/components/core/form/fields/relations/SolidRelationManyToManyField.tsx +32 -24
  114. package/src/components/core/form/fields/relations/SolidRelationManyToOneField.tsx +30 -25
  115. package/src/components/core/form/fields/relations/SolidRelationOneToManyField.tsx +4 -3
  116. package/src/components/core/list/SolidTableRowCell.tsx +12 -0
  117. package/src/components/core/list/columns/SolidDateColumn.tsx +9 -1
  118. package/src/components/core/list/columns/SolidDatetimeColumn.tsx +9 -1
  119. package/src/components/core/list/columns/SolidExternalIdColumn.tsx +10 -1
  120. package/src/components/core/list/columns/SolidIdColumn.tsx +10 -2
  121. package/src/components/core/list/columns/SolidIntColumn.tsx +9 -1
  122. package/src/components/core/list/columns/SolidSelectionDynamicColumn.tsx +10 -1
  123. package/src/components/core/list/columns/SolidSelectionStaticColumn.tsx +10 -1
  124. package/src/components/core/list/columns/SolidShortTextColumn.tsx +9 -4
  125. package/src/components/core/list/columns/SolidTimeColumn.tsx +9 -1
  126. package/src/components/core/list/columns/SolidUuidColumn.tsx +11 -2
  127. package/src/components/core/model/ModelMetaData.tsx +5 -5
  128. package/src/resources/globals.css +2 -1
@@ -90,7 +90,7 @@ const fieldFactory = (type: string, fieldContext: SolidFieldProps): ISolidField
90
90
  if (type === 'longText') {
91
91
  return new SolidLongTextField(fieldContext);
92
92
  }
93
- if (type === 'int' || type === 'bigint' ) {
93
+ if (type === 'int' || type === 'bigint') {
94
94
  return new SolidIntegerField(fieldContext);
95
95
  }
96
96
  if (type === 'decimal' || type === 'float') {
@@ -478,6 +478,15 @@ const SolidFormView = (params: SolidFormViewProps) => {
478
478
  const errorMessages = Object.values(errors);
479
479
  };
480
480
 
481
+ const showToast = (severity: "success" | "error", summary: string, detail: string) => {
482
+ toast.current?.show({
483
+ severity,
484
+ summary,
485
+ detail,
486
+ life: 3000,
487
+ });
488
+ };
489
+
481
490
  const onFormikSubmit = async (values: any) => {
482
491
  const solidView = solidFormViewMetaData.data.solidView;
483
492
  const solidFieldsMetadata = solidFormViewMetaData.data.solidFieldsMetadata;
@@ -510,10 +519,17 @@ const SolidFormView = (params: SolidFormViewProps) => {
510
519
  params.customCreateHandler(formData);
511
520
  } else {
512
521
  if (params.id === 'new') {
513
- createEntity(formData);
522
+ // createEntity(formData);
523
+ const result = await createEntity(formData).unwrap();
524
+ showToast("success", "Form saved", "Form saved successfully!");
525
+ const updatedUrl = pathname.replace("new", result?.data?.id);
526
+ router.push(updatedUrl);
514
527
  }
515
528
  else {
516
- updateEntity({ id: +params.id, data: formData });
529
+ // updateEntity({ id: +params.id, data: formData });
530
+ await updateEntity({ id: +params.id, data: formData }).unwrap();
531
+ // const result = await updateEntity({ id: +params.id, data: formData }).unwrap();
532
+ showToast("success", "Form Updated", "Form updated successfully!");
517
533
  }
518
534
  }
519
535
 
@@ -955,6 +971,7 @@ const SolidFormView = (params: SolidFormViewProps) => {
955
971
  {params.embeded !== true &&
956
972
  actionsAllowed.includes(`${createPermission(params.modelName)}`) &&
957
973
  !formViewLayout.attrs.readonly &&
974
+ formik.dirty &&
958
975
  <div>
959
976
  <Button
960
977
  label="Save"
@@ -87,6 +87,7 @@ export class SolidBooleanField implements ISolidField {
87
87
  <div className="flex flex-column gap-2 mt-4">
88
88
  {showFieldLabel != false &&
89
89
  <label htmlFor={fieldLayoutInfo.attrs.name} className="form-field-label">{fieldLabel}
90
+ {fieldMetadata.required && <span className="text-red-500"> *</span>}
90
91
  {/* &nbsp; {fieldDescription && <span className="form_field_help">({fieldDescription}) </span>} */}
91
92
  </label>
92
93
  }
@@ -112,7 +113,9 @@ export class SolidBooleanField implements ISolidField {
112
113
  />
113
114
  </div>
114
115
  {isFormFieldValid(formik, fieldLayoutInfo.attrs.name) && (
115
- <Message severity="error" text={formik?.errors[fieldLayoutInfo.attrs.name]?.toString()} />
116
+ <div className="absolute mt-1">
117
+ <Message severity="error" text={formik?.errors[fieldLayoutInfo.attrs.name]?.toString()} />
118
+ </div>
116
119
  )}
117
120
  </div>
118
121
  );
@@ -66,6 +66,7 @@ export class SolidDateField implements ISolidField {
66
66
  <div className="flex flex-column gap-2 mt-4">
67
67
  {showFieldLabel != false &&
68
68
  <label htmlFor={fieldLayoutInfo.attrs.name} className="form-field-label">{fieldLabel}
69
+ {fieldMetadata.required && <span className="text-red-500"> *</span>}
69
70
  {/* &nbsp; {fieldDescription && <span className="form_field_help">({fieldDescription}) </span>} */}
70
71
  </label>
71
72
  }
@@ -85,7 +86,9 @@ export class SolidDateField implements ISolidField {
85
86
  />
86
87
  </div>
87
88
  {isFormFieldValid(formik, fieldLayoutInfo.attrs.name) && (
88
- <Message severity="error" text={formik?.errors[fieldLayoutInfo.attrs.name]?.toString()} />
89
+ <div className="absolute mt-1">
90
+ <Message severity="error" text={formik?.errors[fieldLayoutInfo.attrs.name]?.toString()} />
91
+ </div>
89
92
  )}
90
93
  </div>
91
94
  );
@@ -64,6 +64,7 @@ export class SolidDateTimeField implements ISolidField {
64
64
  <div className="flex flex-column gap-2 mt-4">
65
65
  {showFieldLabel != false &&
66
66
  <label htmlFor={fieldLayoutInfo.attrs.name} className="form-field-label">{fieldLabel}
67
+ {fieldMetadata.required && <span className="text-red-500"> *</span>}
67
68
  {/* &nbsp; {fieldDescription && <span className="form_field_help">({fieldDescription}) </span>} */}
68
69
  </label>
69
70
  }
@@ -85,7 +86,9 @@ export class SolidDateTimeField implements ISolidField {
85
86
  />
86
87
  </div>
87
88
  {isFormFieldValid(formik, fieldLayoutInfo.attrs.name) && (
88
- <Message severity="error" text={formik?.errors[fieldLayoutInfo.attrs.name]?.toString()} />
89
+ <div className="absolute mt-1">
90
+ <Message severity="error" text={formik?.errors[fieldLayoutInfo.attrs.name]?.toString()} />
91
+ </div>
89
92
  )}
90
93
  </div>
91
94
  );
@@ -42,8 +42,8 @@ export class SolidDecimalField implements ISolidField {
42
42
  } else {
43
43
  schema = schema.nullable(); // Allow null when not required
44
44
  }
45
- // 2. length (min/max)
46
- if (fieldMetadata.min && fieldMetadata.min > 0) {
45
+ // 2. length (min/max)
46
+ if (fieldMetadata.min && fieldMetadata.min > 0) {
47
47
  schema = schema.min(fieldMetadata.min, `${fieldLabel} should be at-least ${fieldMetadata.min} characters long.`);
48
48
  }
49
49
  if (fieldMetadata.max && fieldMetadata.max > 0) {
@@ -75,6 +75,7 @@ export class SolidDecimalField implements ISolidField {
75
75
  <div className="flex flex-column gap-2 mt-4">
76
76
  {showFieldLabel != false &&
77
77
  <label htmlFor={fieldLayoutInfo.attrs.name} className="form-field-label">{fieldLabel}
78
+ {fieldMetadata.required && <span className="text-red-500"> *</span>}
78
79
  {/* &nbsp; {fieldDescription && <span className="form_field_help">({fieldDescription}) </span>} */}
79
80
  </label>
80
81
  }
@@ -90,7 +91,9 @@ export class SolidDecimalField implements ISolidField {
90
91
  value={formik.values[fieldLayoutInfo.attrs.name] || ''}
91
92
  />
92
93
  {isFormFieldValid(formik, fieldLayoutInfo.attrs.name) && (
93
- <Message severity="error" text={formik?.errors[fieldLayoutInfo.attrs.name]?.toString()} />
94
+ <div className="absolute mt-1">
95
+ <Message severity="error" text={formik?.errors[fieldLayoutInfo.attrs.name]?.toString()} />
96
+ </div>
94
97
  )}
95
98
  </div>
96
99
  </div>
@@ -76,6 +76,7 @@ export class SolidIntegerField implements ISolidField {
76
76
  <div className="flex flex-column gap-2 mt-4">
77
77
  {showFieldLabel != false &&
78
78
  <label htmlFor={fieldLayoutInfo.attrs.name} className="form-field-label">{fieldLabel}
79
+ {fieldMetadata.required && <span className="text-red-500"> *</span>}
79
80
  {/* &nbsp; {fieldDescription && <span className="form_field_help">({fieldDescription}) </span>} */}
80
81
  </label>
81
82
  }
@@ -91,7 +92,9 @@ export class SolidIntegerField implements ISolidField {
91
92
  />
92
93
  </div>
93
94
  {isFormFieldValid(formik, fieldLayoutInfo.attrs.name) && (
94
- <Message severity="error" text={formik?.errors[fieldLayoutInfo.attrs.name]?.toString()} />
95
+ <div className="absolute mt-1">
96
+ <Message severity="error" text={formik?.errors[fieldLayoutInfo.attrs.name]?.toString()} />
97
+ </div>
95
98
  )}
96
99
  </div>
97
100
  );
@@ -60,7 +60,7 @@ export class SolidJsonField implements ISolidField {
60
60
  <div className="flex flex-column gap-2 mt-4">
61
61
  {showFieldLabel != false &&
62
62
  <label htmlFor={fieldLayoutInfo.attrs.name} className="form-field-label">{fieldLabel}
63
-
63
+ {fieldMetadata.required && <span className="text-red-500"> *</span>}
64
64
  {/* &nbsp; {fieldDescription && <span className="form_field_help">({fieldDescription}) </span>} */}
65
65
  </label>
66
66
  }
@@ -69,12 +69,14 @@ export class SolidJsonField implements ISolidField {
69
69
  field={fieldLayoutInfo.attrs.name}
70
70
  height={fieldLayoutInfo.attrs?.height}
71
71
  fontSize={fieldLayoutInfo.attrs?.fontSize}
72
- readOnly={formReadonly || fieldReadonly || readOnlyPermission}
72
+ readOnly={formReadonly || fieldReadonly || readOnlyPermission}
73
73
  >
74
74
  </CodeEditor>
75
75
  </div>
76
76
  {isFormFieldValid(formik, fieldLayoutInfo.attrs.name) && (
77
- <Message severity="error" text={formik?.errors[fieldLayoutInfo.attrs.name]?.toString()} />
77
+ <div className="absolute mt-1">
78
+ <Message severity="error" text={formik?.errors[fieldLayoutInfo.attrs.name]?.toString()} />
79
+ </div>
78
80
  )}
79
81
  </div>
80
82
  );
@@ -81,6 +81,7 @@ export class SolidLongTextField implements ISolidField {
81
81
  <div className="flex flex-column gap-2 mt-4">
82
82
  {showFieldLabel != false &&
83
83
  <label htmlFor={fieldLayoutInfo.attrs.name} className="form-field-label">{fieldLabel}
84
+ {fieldMetadata.required && <span className="text-red-500"> *</span>}
84
85
  {/* &nbsp; {fieldDescription && <span>({fieldDescription}) </span>} */}
85
86
  </label>
86
87
  }
@@ -96,7 +97,9 @@ export class SolidLongTextField implements ISolidField {
96
97
  />
97
98
  </div>
98
99
  {isFormFieldValid(formik, fieldLayoutInfo.attrs.name) && (
99
- <Message severity="error" text={formik?.errors[fieldLayoutInfo.attrs.name]?.toString()} />
100
+ <div className="absolute mt-1">
101
+ <Message severity="error" text={formik?.errors[fieldLayoutInfo.attrs.name]?.toString()} />
102
+ </div>
100
103
  )}
101
104
  </div>
102
105
  );
@@ -101,13 +101,9 @@ export class SolidMediaMultipleField implements ISolidField {
101
101
 
102
102
  const [isDeleteImageDialogVisible, setDeleteImageDialogVisible] = useState(false);
103
103
  const [imageToBeDeletedData, setImageToBeDeletedData] = useState<any>();
104
- const [uploadCompleted, setUploadCompleted] = useState<Record<string, boolean>>({});
105
104
  const [fileDetails, setFileDetails] = useState<{ name: string; type: string; size: number, id: number, fileUrl: string }[]>([]);
106
- const [uploadedSize, setUploadedSize] = useState<Record<string, string>>({});
107
- const [totalSize, setTotalSize] = useState<Record<string, string>>({});
108
105
  const [selectedFileId, setSelectedFileId] = useState<string | null>(null);
109
106
 
110
-
111
107
  const formatFileSize = (size: number) => {
112
108
  return size >= 1024 * 1024
113
109
  ? `${(size / (1024 * 1024)).toFixed(1)} MB`
@@ -117,103 +113,56 @@ export class SolidMediaMultipleField implements ISolidField {
117
113
  deleteMedia,
118
114
  { isLoading: isMediaDeleted, isSuccess: isDeleteMediaSuceess, isError: isMediaDeleteError, error: mediaDeleteError, data: DeletedMedia },
119
115
  ] = useDeleteMediaMutation();
120
-
121
116
  useEffect(() => {
122
117
  const fieldValue = formik?.values[fieldLayoutInfo.attrs.name];
118
+
123
119
  if (Array.isArray(fieldValue) && fieldValue.length > 0) {
124
120
  const urls: string[] = [];
125
121
  const details: { name: string; type: string; size: number, id: any, fileUrl: string }[] = [];
126
- const completed: Record<string, boolean> = {};
127
-
122
+ const objectUrls: string[] = [];
128
123
  fieldValue.forEach((file: File | any) => {
129
124
  if (file instanceof File) {
130
125
  // New file (from local upload)
131
- urls.push(URL.createObjectURL(file));
132
- details.push({ name: file.name, type: file.type, size: file.size, id: `${file.name}-${file.size}`, fileUrl: "" });
126
+ const fileUrl = URL.createObjectURL(file);
127
+ objectUrls.push(fileUrl); // Store URL for cleanup
128
+ urls.push(fileUrl);
129
+
130
+ details.push({
131
+ name: file.name,
132
+ type: file.type,
133
+ size: file.size,
134
+ id: `${file.name}-${file.size}`,
135
+ fileUrl: fileUrl // ✅ Store the generated object URL
136
+ });
133
137
  } else if (typeof file === "object" && file._full_url) {
134
138
  urls.push(file._full_url);
135
139
  details.push({
136
- name: file.relativeUri || "Unknown", // Use relativeUri or fallback
137
- type: file.mediaStorageProviderMetadata?.type || "Unknown", // Extract type if available
138
- size: 0, // API doesn't provide size, set 0 or fetch from metadata if available
140
+ name: file.originalFileName,
141
+ type: file.mimeType,
142
+ size: file.fileSize,
139
143
  id: file.id,
140
144
  fileUrl: file._full_url
141
145
  });
142
146
  }
143
147
  });
144
- details.forEach(file => {
145
- completed[`${file.name}-${file.size}`] = true;
146
- });
147
- setUploadCompleted(completed);
148
148
  setFileDetails(details);
149
149
  }
150
150
  }, [formik.values, fieldLayoutInfo.attrs.name]);
151
151
 
152
152
  const handleDropImages = (acceptedFiles: any[]) => {
153
153
  if (!acceptedFiles.length) return;
154
-
155
154
  const newFileDetails = [...fileDetails];
156
- const newUploadedSize = { ...uploadedSize };
157
- const newTotalSize = { ...totalSize };
158
- const newUploadCompleted = { ...uploadCompleted };
159
-
160
155
  acceptedFiles.forEach((file) => {
161
- const fileId = `${file.name}-${file.size}`; // Unique identifier for tracking each file
162
-
163
156
  newFileDetails.push({ name: file.name, type: file.type, size: file.size, id: file.id, fileUrl: file._full_url });
164
- newUploadedSize[fileId] = "0 KB";
165
- newTotalSize[fileId] = formatFileSize(file.size);
166
- newUploadCompleted[fileId] = false;
167
-
168
157
  const reader = new FileReader();
169
-
170
- reader.onloadstart = () => {
171
- setUploadedSize((prev) => ({ ...prev, [fileId]: "0 KB" }));
172
- };
173
-
174
- reader.onprogress = (event) => {
175
- if (event.loaded && event.total) {
176
- setUploadedSize((prev) => ({ ...prev, [fileId]: formatFileSize(event.loaded) }));
177
- }
178
- };
179
-
180
- reader.onloadend = () => {
181
- setUploadCompleted((prev) => ({ ...prev, [fileId]: true }));
182
- setUploadedSize((prev) => ({ ...prev, [fileId]: newTotalSize[fileId] }));
183
- };
184
-
185
158
  reader.readAsDataURL(file);
186
159
  });
187
160
 
188
161
  setFileDetails(newFileDetails);
189
- setUploadedSize(newUploadedSize);
190
- setTotalSize(newTotalSize);
191
- setUploadCompleted(newUploadCompleted);
192
162
 
193
163
  formik.setFieldValue(fieldLayoutInfo.attrs.name, acceptedFiles);
194
164
  };
195
165
 
196
-
197
- const handleCancelUpload = (fileId: string) => {
198
- setFileDetails((prev) => prev.filter((file) => fileId !== `${file.name}-${file.size}`));
199
- setUploadCompleted((prev) => {
200
- const newCompleted = { ...prev };
201
- delete newCompleted[fileId];
202
- return newCompleted;
203
- });
204
- setUploadedSize((prev) => {
205
- const newSize = { ...prev };
206
- delete newSize[fileId];
207
- return newSize;
208
- });
209
- setTotalSize((prev) => {
210
- const newSize = { ...prev };
211
- delete newSize[fileId];
212
- return newSize;
213
- });
214
- formik.setFieldValue(fieldLayoutInfo.attrs.name, fileDetails.filter((file) => `${file.name}-${file.size}` !== fileId));
215
- };
216
-
217
166
  const confirmDeleteFile = (fileId: any, deleteId: number) => {
218
167
  setSelectedFileId(fileId);
219
168
  setDeleteImageDialogVisible(true);
@@ -228,25 +177,6 @@ export class SolidMediaMultipleField implements ISolidField {
228
177
  deleteMedia(imageToBeDeletedData)
229
178
  .unwrap()
230
179
  .then(() => {
231
- // Ensure UI state updates only after successful deletion
232
- setUploadCompleted((prev) => {
233
- const newCompleted = { ...prev };
234
- delete newCompleted[selectedFileId];
235
- return newCompleted;
236
- });
237
-
238
- setUploadedSize((prev) => {
239
- const newSize = { ...prev };
240
- delete newSize[selectedFileId];
241
- return newSize;
242
- });
243
-
244
- setTotalSize((prev) => {
245
- const newSize = { ...prev };
246
- delete newSize[selectedFileId];
247
- return newSize;
248
- });
249
-
250
180
  // Update form state
251
181
  formik.setFieldValue(
252
182
  fieldLayoutInfo.attrs.name,
@@ -263,7 +193,6 @@ export class SolidMediaMultipleField implements ISolidField {
263
193
  }
264
194
  };
265
195
 
266
-
267
196
  const {
268
197
  getRootProps,
269
198
  getInputProps,
@@ -282,7 +211,7 @@ export class SolidMediaMultipleField implements ISolidField {
282
211
  <div className="flex flex-column gap-2 mt-4">
283
212
  {showFieldLabel != false &&
284
213
  <label htmlFor={fieldLayoutInfo.attrs.name} className="form-field-label">{fieldLabel}
285
-
214
+ {fieldMetadata.required && <span className="text-red-500"> *</span>}
286
215
  {/* &nbsp; {fieldDescription && <span className="form_field_help">({fieldDescription}) </span>} */}
287
216
  </label>
288
217
  }
@@ -303,7 +232,7 @@ export class SolidMediaMultipleField implements ISolidField {
303
232
  <FileReaderExt fileDetails={fileDetails[0]} />
304
233
  <div className="w-full flex flex-column gap-1">
305
234
  <div className="flex align-items-center justify-content-between">
306
- <Link className="font-normal w-11" href={process.env.NEXT_PUBLIC_BACKEND_API_URL + `/${fileDetails[0]?.fileUrl}`} target="_blank">{fileDetails[0].name}</Link>
235
+ <Link className="font-normal w-11" href={`${fileDetails[0]?.fileUrl}`} target="_blank">{fileDetails[0].name}</Link>
307
236
  <div className="flex align-items-center gap-2">
308
237
  <div>
309
238
  <Button
@@ -335,28 +264,21 @@ export class SolidMediaMultipleField implements ISolidField {
335
264
  </div>
336
265
  </div>
337
266
  </div>
338
- {uploadCompleted[`${fileDetails[0].name}-${fileDetails[0].size}`] && (
339
- <div className="flex align-items-center gap-2 text-sm">
340
- {totalSize[`${fileDetails[0].name}-${fileDetails[0].size}`]} of {totalSize[`${fileDetails[0].name}-${fileDetails[0].size}`]}
341
- <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20" fill="none">
342
- <path d="M9.16 12.76L13.39 8.53L12.55 7.69L9.16 11.08L7.45 9.37L6.61 10.21L9.16 12.76ZM10 16C9.17 16 8.39 15.8424 7.66 15.5272C6.93 15.2124 6.295 14.785 5.755 14.245C5.215 13.705 4.7876 13.07 4.4728 12.34C4.1576 11.61 4 10.83 4 10C4 9.17 4.1576 8.39 4.4728 7.66C4.7876 6.93 5.215 6.295 5.755 5.755C6.295 5.215 6.93 4.7874 7.66 4.4722C8.39 4.1574 9.17 4 10 4C10.83 4 11.61 4.1574 12.34 4.4722C13.07 4.7874 13.705 5.215 14.245 5.755C14.785 6.295 15.2124 6.93 15.5272 7.66C15.8424 8.39 16 9.17 16 10C16 10.83 15.8424 11.61 15.5272 12.34C15.2124 13.07 14.785 13.705 14.245 14.245C13.705 14.785 13.07 15.2124 12.34 15.5272C11.61 15.8424 10.83 16 10 16Z" fill="#722ED1" />
343
- </svg>
344
- Completed
345
- </div>
346
- )}
267
+ <div className="flex align-items-center gap-2 text-sm">
268
+ {formatFileSize(fileDetails[0].size)}
269
+ </div>
347
270
  </div>
348
271
  </div>
349
272
  </div>
350
273
  }
351
274
 
352
-
353
275
  {fileDetails.length > 1 &&
354
- <div className="flex align-items-center">
276
+ <div className="flex align-items-center mt-1">
355
277
  <p className="m-0">
356
- {fileDetails.length - 1} items {uploadCompleted ? 'Uploaded' : 'Uploading'}
278
+ {fileDetails.length - 1} items
357
279
  </p>
358
280
  <div>
359
- <Button type="button" text label="View" onClick={() => setShowAllFiles(true)} />
281
+ <Button type="button" size="small" text label="View" onClick={() => setShowAllFiles(true)} />
360
282
  </div>
361
283
  </div>
362
284
  }
@@ -377,7 +299,7 @@ export class SolidMediaMultipleField implements ISolidField {
377
299
  <FileReaderExt fileDetails={file} />
378
300
  <div className="w-full flex flex-column gap-1">
379
301
  <div className="flex align-items-center justify-content-between">
380
- <Link className="font-normal w-11" href={process.env.NEXT_PUBLIC_BACKEND_API_URL + `/${file?.fileUrl}`} target="_blank">{file.name}</Link>
302
+ <Link className="font-normal w-11" href={file?.fileUrl} target="_blank">{file.name}</Link>
381
303
  <div className="flex align-items-center gap-2">
382
304
  <div>
383
305
  <Button
@@ -409,18 +331,9 @@ export class SolidMediaMultipleField implements ISolidField {
409
331
  </div>
410
332
  </div>
411
333
  </div>
412
- {uploadCompleted[fileId] && (
413
- <div className="flex align-items-center gap-2 text-sm">
414
- {totalSize[fileId]} of {totalSize[fileId]}
415
- <svg xmlns="http://www.w3.org/2000/svg" width="4" height="4" viewBox="0 0 4 4" fill="none">
416
- <circle cx="2" cy="2" r="2" fill="#C1C1C1" />
417
- </svg>
418
- <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20" fill="none">
419
- <path d="M9.16 12.76L13.39 8.53L12.55 7.69L9.16 11.08L7.45 9.37L6.61 10.21L9.16 12.76ZM10 16C9.17 16 8.39 15.8424 7.66 15.5272C6.93 15.2124 6.295 14.785 5.755 14.245C5.215 13.705 4.7876 13.07 4.4728 12.34C4.1576 11.61 4 10.83 4 10C4 9.17 4.1576 8.39 4.4728 7.66C4.7876 6.93 5.215 6.295 5.755 5.755C6.295 5.215 6.93 4.7874 7.66 4.4722C8.39 4.1574 9.17 4 10 4C10.83 4 11.61 4.1574 12.34 4.4722C13.07 4.7874 13.705 5.215 14.245 5.755C14.785 6.295 15.2124 6.93 15.5272 7.66C15.8424 8.39 16 9.17 16 10C16 10.83 15.8424 11.61 15.5272 12.34C15.2124 13.07 14.785 13.705 14.245 14.245C13.705 14.785 13.07 15.2124 12.34 15.5272C11.61 15.8424 10.83 16 10 16Z" fill="#722ED1" />
420
- </svg>
421
- Completed
422
- </div>
423
- )}
334
+ <div className="flex align-items-center gap-2 text-sm">
335
+ {formatFileSize(file.size)}
336
+ </div>
424
337
  </div>
425
338
  </div>
426
339
  </div>
@@ -429,7 +342,9 @@ export class SolidMediaMultipleField implements ISolidField {
429
342
  }
430
343
  </Dialog>
431
344
  {isFormFieldValid(formik, fieldLayoutInfo.attrs.name) && (
432
- <Message severity="error" text={formik?.errors[fieldLayoutInfo.attrs.name]?.toString()} />
345
+ <div className="absolute mt-1">
346
+ <Message severity="error" text={formik?.errors[fieldLayoutInfo.attrs.name]?.toString()} />
347
+ </div>
433
348
  )}
434
349
  <Dialog
435
350
  visible={isDeleteImageDialogVisible}
@@ -437,8 +352,8 @@ export class SolidMediaMultipleField implements ISolidField {
437
352
  modal
438
353
  footer={() => (
439
354
  <div className="flex justify-content-center">
440
- <Button label="Yes" icon="pi pi-check" className='small-button' severity="danger" autoFocus onClick={deleteFile} />
441
- <Button label="No" icon="pi pi-times" className='small-button' onClick={() => setDeleteImageDialogVisible(false)} />
355
+ <Button type="button" label="Yes" icon="pi pi-check" className='small-button' severity="danger" autoFocus onClick={deleteFile} />
356
+ <Button type="button" label="No" icon="pi pi-times" className='small-button' onClick={() => setDeleteImageDialogVisible(false)} />
442
357
  </div>
443
358
  )}
444
359
  onHide={() => setDeleteImageDialogVisible(false)}