@solidstarters/solid-core-ui 1.1.10 → 1.1.12

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 (188) hide show
  1. package/dist/components/auth/SolidForgotPassword.d.ts.map +1 -1
  2. package/dist/components/auth/SolidForgotPassword.js +2 -1
  3. package/dist/components/auth/SolidForgotPassword.js.map +1 -1
  4. package/dist/components/auth/SolidInitialLoginOtp.d.ts.map +1 -1
  5. package/dist/components/auth/SolidInitialLoginOtp.js +2 -1
  6. package/dist/components/auth/SolidInitialLoginOtp.js.map +1 -1
  7. package/dist/components/auth/SolidInitiateRegisterOtp.d.ts.map +1 -1
  8. package/dist/components/auth/SolidInitiateRegisterOtp.js +2 -1
  9. package/dist/components/auth/SolidInitiateRegisterOtp.js.map +1 -1
  10. package/dist/components/auth/SolidLogin.d.ts.map +1 -1
  11. package/dist/components/auth/SolidLogin.js +2 -1
  12. package/dist/components/auth/SolidLogin.js.map +1 -1
  13. package/dist/components/auth/SolidOTPVerify.d.ts.map +1 -1
  14. package/dist/components/auth/SolidOTPVerify.js +2 -1
  15. package/dist/components/auth/SolidOTPVerify.js.map +1 -1
  16. package/dist/components/auth/SolidRegister.d.ts.map +1 -1
  17. package/dist/components/auth/SolidRegister.js +125 -103
  18. package/dist/components/auth/SolidRegister.js.map +1 -1
  19. package/dist/components/auth/SolidResetPassword.d.ts.map +1 -1
  20. package/dist/components/auth/SolidResetPassword.js +2 -1
  21. package/dist/components/auth/SolidResetPassword.js.map +1 -1
  22. package/dist/components/common/DropzonePlaceholder.js +1 -1
  23. package/dist/components/common/DropzonePlaceholder.js.map +1 -1
  24. package/dist/components/common/GeneralSettings.d.ts.map +1 -1
  25. package/dist/components/common/GeneralSettings.js +43 -31
  26. package/dist/components/common/GeneralSettings.js.map +1 -1
  27. package/dist/components/core/common/FilterComponent.d.ts +2 -1
  28. package/dist/components/core/common/FilterComponent.d.ts.map +1 -1
  29. package/dist/components/core/common/FilterComponent.js +52 -16
  30. package/dist/components/core/common/FilterComponent.js.map +1 -1
  31. package/dist/components/core/common/SolidConfigureLayoutElement.d.ts +1 -1
  32. package/dist/components/core/common/SolidConfigureLayoutElement.d.ts.map +1 -1
  33. package/dist/components/core/common/SolidConfigureLayoutElement.js +5 -2
  34. package/dist/components/core/common/SolidConfigureLayoutElement.js.map +1 -1
  35. package/dist/components/core/common/SolidGlobalSearchElement.d.ts.map +1 -1
  36. package/dist/components/core/common/SolidGlobalSearchElement.js +131 -23
  37. package/dist/components/core/common/SolidGlobalSearchElement.js.map +1 -1
  38. package/dist/components/core/filter/SolidManyToOneFilterElement.d.ts.map +1 -1
  39. package/dist/components/core/filter/SolidManyToOneFilterElement.js +8 -6
  40. package/dist/components/core/filter/SolidManyToOneFilterElement.js.map +1 -1
  41. package/dist/components/core/filter/SolidSelectionDynamicFilterElement.js +1 -1
  42. package/dist/components/core/filter/SolidSelectionDynamicFilterElement.js.map +1 -1
  43. package/dist/components/core/filter/SolidSelectionStaticFilterElement.js +1 -1
  44. package/dist/components/core/filter/SolidSelectionStaticFilterElement.js.map +1 -1
  45. package/dist/components/core/filter/SolidVarInputsFilterElement.d.ts.map +1 -1
  46. package/dist/components/core/filter/SolidVarInputsFilterElement.js +11 -10
  47. package/dist/components/core/filter/SolidVarInputsFilterElement.js.map +1 -1
  48. package/dist/components/core/form/SolidFormView.d.ts.map +1 -1
  49. package/dist/components/core/form/SolidFormView.js +49 -14
  50. package/dist/components/core/form/SolidFormView.js.map +1 -1
  51. package/dist/components/core/form/fields/SolidBooleanField.d.ts.map +1 -1
  52. package/dist/components/core/form/fields/SolidBooleanField.js +9 -5
  53. package/dist/components/core/form/fields/SolidBooleanField.js.map +1 -1
  54. package/dist/components/core/form/fields/SolidDateField.d.ts.map +1 -1
  55. package/dist/components/core/form/fields/SolidDateField.js +12 -8
  56. package/dist/components/core/form/fields/SolidDateField.js.map +1 -1
  57. package/dist/components/core/form/fields/SolidDateTimeField.d.ts.map +1 -1
  58. package/dist/components/core/form/fields/SolidDateTimeField.js +12 -8
  59. package/dist/components/core/form/fields/SolidDateTimeField.js.map +1 -1
  60. package/dist/components/core/form/fields/SolidDecimalField.d.ts.map +1 -1
  61. package/dist/components/core/form/fields/SolidDecimalField.js +9 -5
  62. package/dist/components/core/form/fields/SolidDecimalField.js.map +1 -1
  63. package/dist/components/core/form/fields/SolidIntegerField.d.ts.map +1 -1
  64. package/dist/components/core/form/fields/SolidIntegerField.js +9 -5
  65. package/dist/components/core/form/fields/SolidIntegerField.js.map +1 -1
  66. package/dist/components/core/form/fields/SolidJsonField.d.ts.map +1 -1
  67. package/dist/components/core/form/fields/SolidJsonField.js +2 -2
  68. package/dist/components/core/form/fields/SolidJsonField.js.map +1 -1
  69. package/dist/components/core/form/fields/SolidLongTextField.d.ts.map +1 -1
  70. package/dist/components/core/form/fields/SolidLongTextField.js +7 -3
  71. package/dist/components/core/form/fields/SolidLongTextField.js.map +1 -1
  72. package/dist/components/core/form/fields/SolidMediaMultipleField.d.ts.map +1 -1
  73. package/dist/components/core/form/fields/SolidMediaMultipleField.js +155 -46
  74. package/dist/components/core/form/fields/SolidMediaMultipleField.js.map +1 -1
  75. package/dist/components/core/form/fields/SolidMediaSingleField.d.ts.map +1 -1
  76. package/dist/components/core/form/fields/SolidMediaSingleField.js +87 -31
  77. package/dist/components/core/form/fields/SolidMediaSingleField.js.map +1 -1
  78. package/dist/components/core/form/fields/SolidRichTextField.d.ts.map +1 -1
  79. package/dist/components/core/form/fields/SolidRichTextField.js +2 -2
  80. package/dist/components/core/form/fields/SolidRichTextField.js.map +1 -1
  81. package/dist/components/core/form/fields/SolidSelectionDynamicField.d.ts.map +1 -1
  82. package/dist/components/core/form/fields/SolidSelectionDynamicField.js +4 -4
  83. package/dist/components/core/form/fields/SolidSelectionDynamicField.js.map +1 -1
  84. package/dist/components/core/form/fields/SolidSelectionStaticField.d.ts.map +1 -1
  85. package/dist/components/core/form/fields/SolidSelectionStaticField.js +18 -9
  86. package/dist/components/core/form/fields/SolidSelectionStaticField.js.map +1 -1
  87. package/dist/components/core/form/fields/SolidShortTextField.d.ts.map +1 -1
  88. package/dist/components/core/form/fields/SolidShortTextField.js +7 -3
  89. package/dist/components/core/form/fields/SolidShortTextField.js.map +1 -1
  90. package/dist/components/core/form/fields/SolidTimeField.d.ts.map +1 -1
  91. package/dist/components/core/form/fields/SolidTimeField.js +12 -8
  92. package/dist/components/core/form/fields/SolidTimeField.js.map +1 -1
  93. package/dist/components/core/form/fields/relations/SolidRelationManyToManyField.js +22 -15
  94. package/dist/components/core/form/fields/relations/SolidRelationManyToManyField.js.map +1 -1
  95. package/dist/components/core/form/fields/relations/SolidRelationManyToOneField.d.ts.map +1 -1
  96. package/dist/components/core/form/fields/relations/SolidRelationManyToOneField.js +11 -8
  97. package/dist/components/core/form/fields/relations/SolidRelationManyToOneField.js.map +1 -1
  98. package/dist/components/core/form/fields/relations/SolidRelationOneToManyField.js +2 -2
  99. package/dist/components/core/form/fields/relations/SolidRelationOneToManyField.js.map +1 -1
  100. package/dist/components/core/list/SolidListView.d.ts.map +1 -1
  101. package/dist/components/core/list/SolidListView.js +88 -63
  102. package/dist/components/core/list/SolidListView.js.map +1 -1
  103. package/dist/components/core/list/SolidManyToOneFilterElement.js +7 -5
  104. package/dist/components/core/list/SolidManyToOneFilterElement.js.map +1 -1
  105. package/dist/components/core/list/columns/SolidBooleanColumn.js +3 -1
  106. package/dist/components/core/list/columns/SolidBooleanColumn.js.map +1 -1
  107. package/dist/components/core/list/columns/relations/SolidRelationManyToOneColumn.js +2 -1
  108. package/dist/components/core/list/columns/relations/SolidRelationManyToOneColumn.js.map +1 -1
  109. package/dist/components/core/model/CreateModel.d.ts.map +1 -1
  110. package/dist/components/core/model/CreateModel.js +20 -16
  111. package/dist/components/core/model/CreateModel.js.map +1 -1
  112. package/dist/components/core/model/FieldMetaDataForm.d.ts.map +1 -1
  113. package/dist/components/core/model/FieldMetaDataForm.js +67 -54
  114. package/dist/components/core/model/FieldMetaDataForm.js.map +1 -1
  115. package/dist/components/core/model/FieldSelector.js +1 -1
  116. package/dist/components/core/model/FieldSelector.js.map +1 -1
  117. package/dist/components/core/model/ModelMetaData.d.ts.map +1 -1
  118. package/dist/components/core/model/ModelMetaData.js +12 -17
  119. package/dist/components/core/model/ModelMetaData.js.map +1 -1
  120. package/dist/components/core/module/CreateModule.d.ts.map +1 -1
  121. package/dist/components/core/module/CreateModule.js +23 -23
  122. package/dist/components/core/module/CreateModule.js.map +1 -1
  123. package/dist/components/layout/AppSidebar.d.ts.map +1 -1
  124. package/dist/components/layout/AppSidebar.js +42 -11
  125. package/dist/components/layout/AppSidebar.js.map +1 -1
  126. package/dist/components/layout/navbar-two-menu.d.ts.map +1 -1
  127. package/dist/components/layout/navbar-two-menu.js +6 -2
  128. package/dist/components/layout/navbar-two-menu.js.map +1 -1
  129. package/dist/components/layout/user-profile-menu.d.ts.map +1 -1
  130. package/dist/components/layout/user-profile-menu.js +7 -3
  131. package/dist/components/layout/user-profile-menu.js.map +1 -1
  132. package/dist/helpers/AppTitle.d.ts +4 -0
  133. package/dist/helpers/AppTitle.d.ts.map +1 -0
  134. package/dist/helpers/AppTitle.js +8 -0
  135. package/dist/helpers/AppTitle.js.map +1 -0
  136. package/dist/index.d.ts +1 -0
  137. package/dist/index.d.ts.map +1 -1
  138. package/dist/index.js +1 -0
  139. package/dist/index.js.map +1 -1
  140. package/package.json +1 -1
  141. package/src/components/auth/SolidForgotPassword.tsx +2 -6
  142. package/src/components/auth/SolidInitialLoginOtp.tsx +2 -6
  143. package/src/components/auth/SolidInitiateRegisterOtp.tsx +2 -6
  144. package/src/components/auth/SolidLogin.tsx +2 -5
  145. package/src/components/auth/SolidOTPVerify.tsx +4 -7
  146. package/src/components/auth/SolidRegister.tsx +207 -178
  147. package/src/components/auth/SolidResetPassword.tsx +2 -6
  148. package/src/components/common/DropzonePlaceholder.tsx +1 -1
  149. package/src/components/common/GeneralSettings.tsx +310 -193
  150. package/src/components/core/common/FilterComponent.tsx +148 -202
  151. package/src/components/core/common/SolidConfigureLayoutElement.tsx +6 -4
  152. package/src/components/core/common/SolidGlobalSearchElement.tsx +193 -50
  153. package/src/components/core/filter/SolidManyToOneFilterElement.tsx +5 -3
  154. package/src/components/core/filter/SolidSelectionDynamicFilterElement.tsx +1 -1
  155. package/src/components/core/filter/SolidSelectionStaticFilterElement.tsx +1 -1
  156. package/src/components/core/filter/SolidVarInputsFilterElement.tsx +103 -135
  157. package/src/components/core/form/SolidFormView.tsx +64 -25
  158. package/src/components/core/form/fields/SolidBooleanField.tsx +12 -5
  159. package/src/components/core/form/fields/SolidDateField.tsx +9 -4
  160. package/src/components/core/form/fields/SolidDateTimeField.tsx +27 -21
  161. package/src/components/core/form/fields/SolidDecimalField.tsx +9 -2
  162. package/src/components/core/form/fields/SolidIntegerField.tsx +22 -15
  163. package/src/components/core/form/fields/SolidJsonField.tsx +14 -12
  164. package/src/components/core/form/fields/SolidLongTextField.tsx +22 -16
  165. package/src/components/core/form/fields/SolidMediaMultipleField.tsx +257 -79
  166. package/src/components/core/form/fields/SolidMediaSingleField.tsx +148 -61
  167. package/src/components/core/form/fields/SolidRichTextField.tsx +6 -4
  168. package/src/components/core/form/fields/SolidSelectionDynamicField.tsx +6 -5
  169. package/src/components/core/form/fields/SolidSelectionStaticField.tsx +34 -23
  170. package/src/components/core/form/fields/SolidShortTextField.tsx +23 -16
  171. package/src/components/core/form/fields/SolidTimeField.tsx +27 -20
  172. package/src/components/core/form/fields/relations/SolidRelationManyToManyField.tsx +9 -9
  173. package/src/components/core/form/fields/relations/SolidRelationManyToOneField.tsx +20 -19
  174. package/src/components/core/form/fields/relations/SolidRelationOneToManyField.tsx +2 -2
  175. package/src/components/core/list/SolidListView.tsx +91 -49
  176. package/src/components/core/list/SolidManyToOneFilterElement.tsx +2 -2
  177. package/src/components/core/list/columns/SolidBooleanColumn.tsx +2 -2
  178. package/src/components/core/list/columns/relations/SolidRelationManyToOneColumn.tsx +1 -1
  179. package/src/components/core/model/CreateModel.tsx +92 -81
  180. package/src/components/core/model/FieldMetaDataForm.tsx +166 -87
  181. package/src/components/core/model/FieldSelector.tsx +1 -1
  182. package/src/components/core/model/ModelMetaData.tsx +8 -7
  183. package/src/components/core/module/CreateModule.tsx +181 -183
  184. package/src/components/layout/AppSidebar.tsx +35 -10
  185. package/src/components/layout/navbar-two-menu.tsx +6 -1
  186. package/src/components/layout/user-profile-menu.tsx +20 -8
  187. package/src/helpers/AppTitle.tsx +14 -0
  188. package/src/index.ts +2 -1
@@ -10,7 +10,8 @@ import { useDropzone } from "react-dropzone";
10
10
  import * as Yup from 'yup';
11
11
  import { Schema } from "yup";
12
12
  import { FormikObject, ISolidField, SolidFieldProps } from "./ISolidField";
13
-
13
+ import { FileReaderExt } from "@/components/common/FileReaderExt";
14
+ import { ProgressBar } from "primereact/progressbar";
14
15
  export class SolidMediaMultipleField implements ISolidField {
15
16
 
16
17
  private fieldContext: SolidFieldProps;
@@ -88,7 +89,7 @@ export class SolidMediaMultipleField implements ISolidField {
88
89
  render(formik: FormikObject) {
89
90
  const fieldMetadata = this.fieldContext.fieldMetadata;
90
91
  const fieldLayoutInfo = this.fieldContext.field;
91
- const className = fieldLayoutInfo.attrs?.className || 'field col-6 flex flex-column gap-2 mt-4';
92
+ const className = fieldLayoutInfo.attrs?.className || 'field col-12';
92
93
  const fieldLabel = fieldLayoutInfo.attrs.label ?? fieldMetadata.displayName;
93
94
  const fieldDescription = fieldLayoutInfo.attrs.description ?? fieldMetadata.description;
94
95
  const solidFormViewMetaData = this.fieldContext.solidFormViewMetaData;
@@ -96,61 +97,156 @@ export class SolidMediaMultipleField implements ISolidField {
96
97
  const [imagesPreview, setImagesPreview] = useState<Array<string | ArrayBuffer>>([]);
97
98
  const [isDeleteImageDialogVisible, setDeleteImageDialogVisible] = useState(false);
98
99
  const [imageToBeDeletedData, setImageToBeDeletedData] = useState<any>();
100
+ const [uploadProgress, setUploadProgress] = useState<Record<string, number>>({});
101
+ const [uploadCompleted, setUploadCompleted] = useState<Record<string, boolean>>({});
102
+ const [fileDetails, setFileDetails] = useState<{ name: string; type: string; size: number }[]>([]);
103
+ const [uploadedSize, setUploadedSize] = useState<Record<string, string>>({});
104
+ const [totalSize, setTotalSize] = useState<Record<string, string>>({});
105
+ const [selectedFileId, setSelectedFileId] = useState<string | null>(null);
99
106
 
100
- const fieldDisabled = fieldLayoutInfo.attrs?.disabled;
101
- const fieldReadonly = fieldLayoutInfo.attrs?.readonly;
102
-
103
- const formDisabled = solidFormViewMetaData.data.solidView?.layout?.attrs?.disabled;
104
- const formReadonly = solidFormViewMetaData.data.solidView?.layout?.attrs?.readonly;
105
-
107
+ const formatFileSize = (size: number) => {
108
+ return size >= 1024 * 1024
109
+ ? `${(size / (1024 * 1024)).toFixed(1)} MB`
110
+ : `${(size / 1024).toFixed(1)} KB`;
111
+ };
106
112
  const [
107
113
  deleteMedia,
108
114
  { isLoading: isMediaDeleted, isSuccess: isDeleteMediaSuceess, isError: isMediaDeleteError, error: mediaDeleteError, data: DeletedMedia },
109
115
  ] = useDeleteMediaMutation();
110
116
 
111
117
  useEffect(() => {
112
- // Sync imagesPreview with Formik's field value on mount/update
113
- if (formik.values[fieldLayoutInfo.attrs.name]) {
114
- const existingFiles = formik.values[fieldLayoutInfo.attrs.name] || [];
115
- const urls = existingFiles.map((file: File | any) => {
118
+ const fieldValue = formik?.values[fieldLayoutInfo.attrs.name];
119
+ if (Array.isArray(fieldValue) && fieldValue.length > 0) {
120
+ const urls: string[] = [];
121
+ const details: { name: string; type: string; size: number }[] = [];
122
+ const progress: Record<string, number> = {};
123
+ const completed: Record<string, boolean> = {};
124
+
125
+ fieldValue.forEach((file: File | any) => {
116
126
  if (file instanceof File) {
117
- return URL.createObjectURL(file); // Generate preview URL for file
118
- }
119
- if (typeof file === 'object') {
120
- return file; // Handle existing URL strings
127
+ // New file (from local upload)
128
+ urls.push(URL.createObjectURL(file));
129
+ details.push({ name: file.name, type: file.type, size: file.size });
130
+ } else if (typeof file === "object" && file._full_url) {
131
+ urls.push(file._full_url);
132
+ details.push({
133
+ name: file.relativeUri || "Unknown", // Use relativeUri or fallback
134
+ type: file.mediaStorageProviderMetadata?.type || "Unknown", // Extract type if available
135
+ size: 0, // API doesn't provide size, set 0 or fetch from metadata if available
136
+ });
121
137
  }
122
138
  });
139
+ details.forEach(file => {
140
+ progress[`${file.name}-${file.size}`] = 100;
141
+ completed[`${file.name}-${file.size}`] = true;
142
+ });
143
+ setUploadProgress(progress);
144
+ setUploadCompleted(completed);
123
145
  setImagesPreview(urls);
146
+ setFileDetails(details);
124
147
  }
125
148
  }, [formik.values, fieldLayoutInfo.attrs.name]);
126
149
 
127
- const handleDrop = (acceptedFiles: File[]) => {
128
- const currentFiles = formik.values[fieldLayoutInfo.attrs.name] || [];
129
- const updatedFiles = [...currentFiles, ...acceptedFiles];
130
- formik.setFieldValue(fieldLayoutInfo.attrs.name, updatedFiles);
150
+ const handleDropImages = (acceptedFiles: File[]) => {
151
+ if (!acceptedFiles.length) return;
152
+
153
+ const newFileDetails = [...fileDetails];
154
+ const newUploadProgress = { ...uploadProgress };
155
+ const newUploadedSize = { ...uploadedSize };
156
+ const newTotalSize = { ...totalSize };
157
+ const newUploadCompleted = { ...uploadCompleted };
158
+
159
+ acceptedFiles.forEach((file) => {
160
+ const fileId = `${file.name}-${file.size}`; // Unique identifier for tracking each file
161
+
162
+ newFileDetails.push({ name: file.name, type: file.type, size: file.size });
163
+ newUploadProgress[fileId] = 0;
164
+ newUploadedSize[fileId] = "0 KB";
165
+ newTotalSize[fileId] = formatFileSize(file.size);
166
+ newUploadCompleted[fileId] = false;
167
+
168
+ const reader = new FileReader();
169
+
170
+ reader.onloadstart = () => {
171
+ setUploadProgress((prev) => ({ ...prev, [fileId]: 0 }));
172
+ setUploadedSize((prev) => ({ ...prev, [fileId]: "0 KB" }));
173
+ };
174
+
175
+ reader.onprogress = (event) => {
176
+ if (event.loaded && event.total) {
177
+ const percent = Math.round((event.loaded / event.total) * 100);
178
+ setUploadProgress((prev) => ({ ...prev, [fileId]: percent }));
179
+ setUploadedSize((prev) => ({ ...prev, [fileId]: formatFileSize(event.loaded) }));
180
+ }
181
+ };
182
+
183
+ reader.onloadend = () => {
184
+ setUploadProgress((prev) => ({ ...prev, [fileId]: 100 }));
185
+ setUploadCompleted((prev) => ({ ...prev, [fileId]: true }));
186
+ setUploadedSize((prev) => ({ ...prev, [fileId]: newTotalSize[fileId] }));
187
+ };
188
+
189
+ reader.readAsDataURL(file);
190
+ });
191
+
192
+ setFileDetails(newFileDetails);
193
+ setUploadProgress(newUploadProgress);
194
+ setUploadedSize(newUploadedSize);
195
+ setTotalSize(newTotalSize);
196
+ setUploadCompleted(newUploadCompleted);
197
+
198
+ formik.setFieldValue(fieldLayoutInfo.attrs.name, acceptedFiles);
131
199
  };
132
200
 
133
201
 
134
- const handleDelete = () => {
135
- imageToBeDeletedData.e.stopPropagation();
136
- const currentFiles = formik.values[fieldLayoutInfo.attrs.name] || [];
137
- const updatedFiles = currentFiles.filter((_: any, i: number) => i !== imageToBeDeletedData.index);
138
- formik.setFieldValue(fieldLayoutInfo.attrs.name, updatedFiles);
139
- if (!(currentFiles[imageToBeDeletedData.index] instanceof File)) {
140
- deleteMedia(currentFiles[imageToBeDeletedData.index].id);
141
- }
142
- setDeleteImageDialogVisible(false);
202
+ const handleCancelUpload = (fileId: string) => {
203
+ setFileDetails((prev) => prev.filter((file) => fileId !== `${file.name}-${file.size}`));
204
+ setUploadProgress((prev) => {
205
+ const newProgress = { ...prev };
206
+ delete newProgress[fileId];
207
+ return newProgress;
208
+ });
209
+ setUploadCompleted((prev) => {
210
+ const newCompleted = { ...prev };
211
+ delete newCompleted[fileId];
212
+ return newCompleted;
213
+ });
214
+ setUploadedSize((prev) => {
215
+ const newSize = { ...prev };
216
+ delete newSize[fileId];
217
+ return newSize;
218
+ });
219
+ setTotalSize((prev) => {
220
+ const newSize = { ...prev };
221
+ delete newSize[fileId];
222
+ return newSize;
223
+ });
224
+ formik.setFieldValue(fieldLayoutInfo.attrs.name, fileDetails.filter((file) => `${file.name}-${file.size}` !== fileId));
225
+ };
143
226
 
227
+ const confirmDeleteFile = (fileId: any) => {
228
+ setSelectedFileId(fileId);
229
+ setDeleteImageDialogVisible(true);
144
230
  };
145
231
 
232
+ const deleteFile = () => {
233
+ if (selectedFileId) {
234
+ handleCancelUpload(selectedFileId);
235
+ setDeleteImageDialogVisible(false);
236
+ setSelectedFileId(null);
237
+ }
238
+ };
146
239
  const {
147
240
  getRootProps,
148
241
  getInputProps,
149
242
  isDragActive,
150
243
  } = useDropzone({
151
- onDrop: handleDrop,
152
- accept: { "image/jpeg": [], "image/png": [] },
153
- maxSize: 2 * 1024 * 1024,
244
+ onDrop: handleDropImages,
245
+ accept: {
246
+ "image/jpeg": [],
247
+ "image/png": [],
248
+ },
249
+ maxSize: 2 * 1024 * 1024, // 2MB
154
250
  });
155
251
 
156
252
  const isFormFieldValid = (formik: any, fieldName: string) => formik.touched[fieldName] && formik.errors[fieldName];
@@ -169,67 +265,149 @@ export class SolidMediaMultipleField implements ISolidField {
169
265
  return ""; // Fallback for invalid cases
170
266
  }
171
267
 
268
+ const [isShowAllFiles, setShowAllFiles] = useState(false);
172
269
  return (
173
270
  <div className={className}>
174
- <label htmlFor={fieldLayoutInfo.attrs.name} className="form-field-label">{fieldLabel}
271
+ <div className="flex flex-column gap-2 mt-4">
272
+ <label htmlFor={fieldLayoutInfo.attrs.name} className="form-field-label">{fieldLabel}
175
273
 
176
- &nbsp; {fieldDescription && <span className="form_field_help">({fieldDescription}) </span>}
177
- </label>
178
- <div
179
- {...getRootProps()}
180
- className="dropzone p-3 border-1 border-round surface-border"
181
- >
182
- <input {...getInputProps()}
183
- />
184
- {isDragActive ? (
274
+ &nbsp; {fieldDescription && <span className="form_field_help">({fieldDescription}) </span>}
275
+ </label>
276
+ <div
277
+ {...getRootProps()}
278
+ className="solid-dropzone-wrapper"
279
+ >
280
+ <input {...getInputProps()} />
185
281
  <DropzonePlaceholder />
282
+ </div>
283
+ </div>
284
+ {fileDetails.length > 0 &&
285
+ <div className="solid-file-upload-wrapper">
286
+ <div className="flex align-items-center gap-2">
287
+ <FileReaderExt fileDetails={fileDetails[0]} />
288
+ <div className="w-full flex flex-column gap-1">
289
+ <div className="flex align-items-center justify-content-between">
290
+ <div className="font-bold">{fileDetails[0].name}</div>
291
+ <div
292
+ className="cancel-upload-button"
293
+ onClick={() => confirmDeleteFile(`${fileDetails[0].name}-${fileDetails[0].size}`)}
294
+ >
295
+ <svg xmlns="http://www.w3.org/2000/svg" width="6" height="6" viewBox="0 0 6 6" fill="none">
296
+ <path d="M0.6 6L0 5.4L2.4 3L0 0.6L0.6 0L3 2.4L5.4 0L6 0.6L3.6 3L6 5.4L5.4 6L3 3.6L0.6 6Z" fill="#4B4D52" />
297
+ </svg>
298
+ </div>
299
+ </div>
300
+ {uploadCompleted[`${fileDetails[0].name}-${fileDetails[0].size}`] ? (
301
+ <div className="flex align-items-center gap-2 text-sm">
302
+ {totalSize[`${fileDetails[0].name}-${fileDetails[0].size}`]} of {totalSize[`${fileDetails[0].name}-${fileDetails[0].size}`]}
303
+ <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20" fill="none">
304
+ <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" />
305
+ </svg>
306
+ Completed
307
+ </div>
308
+ ) : (
309
+ <div className="flex align-items-center gap-2 text-sm">
310
+ {uploadedSize[`${fileDetails[0].name}-${fileDetails[0].size}`]} of {totalSize[`${fileDetails[0].name}-${fileDetails[0].size}`]}
311
+ <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" fill="none">
312
+ <path d="M7.375 10.5V5.40625L5.75 7.03125L4.875 6.125L8 3L11.125 6.125L10.25 7.03125L8.625 5.40625V10.5H7.375ZM4.25 13C3.90625 13 3.61198 12.8776 3.36719 12.6328C3.1224 12.388 3 12.0938 3 11.75V9.875H4.25V11.75H11.75V9.875H13V11.75C13 12.0938 12.8776 12.388 12.6328 12.6328C12.388 12.8776 12.0938 13 11.75 13H4.25Z" fill="black" />
313
+ </svg>
314
+ Uploading {uploadProgress[`${fileDetails[0].name}-${fileDetails[0].size}`]}% Completed
315
+ </div>
316
+ )}
317
+ </div>
318
+ </div>
319
+ <ProgressBar
320
+ value={uploadProgress[`${fileDetails[0].name}-${fileDetails[0].size}`]}
321
+ showValue={false}
322
+ style={{ height: 4 }}
323
+ className="mt-2"
324
+ />
325
+ </div>
326
+ }
186
327
 
187
- ) : imagesPreview.length > 0 ? (
188
- <div className="flex overflow-auto gap-3">
189
- {imagesPreview.map((preview, index) => (
190
- <div key={index} className="relative">
328
+ {fileDetails.length > 1 &&
329
+ <div className="flex align-items-center">
330
+ <p className="m-0">
331
+ {fileDetails.length - 1} items {uploadCompleted ? 'Uploaded' : 'Uploading'}
332
+ </p>
333
+ <div>
334
+ <Button type="button" text label="View" onClick={() => setShowAllFiles(true)} />
335
+ </div>
336
+ </div>
337
+ }
191
338
 
192
- <img
193
- src={imageFormatHandler(preview) as string}
194
- alt={`Preview ${index + 1}`}
195
- className="bg-white h-10rem w-14rem"
196
- />
197
- <Button
198
- type="button"
199
- onClick={(e) => {
200
- e.stopPropagation();
201
- setDeleteImageDialogVisible(true);
202
- const data = {
203
- index, e
204
- }
205
- setImageToBeDeletedData(data)
206
- }}
207
- icon="pi pi-trash"
208
- severity="secondary"
209
- outlined
210
- className="absolute right-0 top-0 bg-white z-5 m-2"
211
- style={{ height: 25, width: 25 }}
339
+ <Dialog
340
+ visible={isShowAllFiles}
341
+ header="Items Uploaded"
342
+ modal
343
+ onHide={() => setShowAllFiles(false)}
344
+ style={{ minWidth: 450 }}
345
+ >
346
+ {fileDetails.length > 1 &&
347
+ fileDetails.map((file, index) => {
348
+ const fileId = `${file.name}-${file.size}`;
349
+ return (
350
+ <div key={fileId} className="solid-file-upload-wrapper">
351
+ <div className="flex align-items-center gap-2">
352
+ <FileReaderExt fileDetails={file} />
353
+ <div className="w-full flex flex-column gap-1">
354
+ <div className="flex align-items-center justify-content-between">
355
+ <div className="font-bold">{file.name}</div>
356
+ <div
357
+ className="cancel-upload-button"
358
+ onClick={() => confirmDeleteFile(fileId)}
359
+ >
360
+ <svg xmlns="http://www.w3.org/2000/svg" width="6" height="6" viewBox="0 0 6 6" fill="none">
361
+ <path d="M0.6 6L0 5.4L2.4 3L0 0.6L0.6 0L3 2.4L5.4 0L6 0.6L3.6 3L6 5.4L5.4 6L3 3.6L0.6 6Z" fill="#4B4D52" />
362
+ </svg>
363
+ </div>
364
+ </div>
365
+ {uploadCompleted[fileId] ? (
366
+ <div className="flex align-items-center gap-2 text-sm">
367
+ {totalSize[fileId]} of {totalSize[fileId]}
368
+ <svg xmlns="http://www.w3.org/2000/svg" width="4" height="4" viewBox="0 0 4 4" fill="none">
369
+ <circle cx="2" cy="2" r="2" fill="#C1C1C1" />
370
+ </svg>
371
+ <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20" fill="none">
372
+ <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" />
373
+ </svg>
374
+ Completed
375
+ </div>
376
+ ) : (
377
+ <div className="flex align-items-center gap-2 text-sm">
378
+ {uploadedSize[fileId]} of {totalSize[fileId]}
379
+ <svg xmlns="http://www.w3.org/2000/svg" width="4" height="4" viewBox="0 0 4 4" fill="none">
380
+ <circle cx="2" cy="2" r="2" fill="#C1C1C1" />
381
+ </svg>
382
+ <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" fill="none">
383
+ <path d="M7.375 10.5V5.40625L5.75 7.03125L4.875 6.125L8 3L11.125 6.125L10.25 7.03125L8.625 5.40625V10.5H7.375ZM4.25 13C3.90625 13 3.61198 12.8776 3.36719 12.6328C3.1224 12.388 3 12.0938 3 11.75V9.875H4.25V11.75H11.75V9.875H13V11.75C13 12.0938 12.8776 12.388 12.6328 12.6328C12.388 12.8776 12.0938 13 11.75 13H4.25Z" fill="black" />
384
+ </svg>
385
+ Uploading {uploadProgress[fileId]}% Completed
386
+ </div>
387
+ )}
388
+ </div>
389
+ </div>
390
+ <ProgressBar
391
+ value={uploadProgress[fileId]}
392
+ showValue={false}
393
+ style={{ height: 4 }}
394
+ className="mt-2"
212
395
  />
213
- <DropzoneUpload />
214
-
215
396
  </div>
216
- ))}
217
- </div>
218
- ) :
219
- <DropzonePlaceholder />
397
+ );
398
+ })
220
399
  }
221
-
222
- {isFormFieldValid(formik, fieldLayoutInfo.attrs.name) && (
223
- <Message severity="error" text={formik?.errors[fieldLayoutInfo.attrs.name]?.toString()} />
224
- )}
225
- </div>
400
+ </Dialog>
401
+ {isFormFieldValid(formik, fieldLayoutInfo.attrs.name) && (
402
+ <Message severity="error" text={formik?.errors[fieldLayoutInfo.attrs.name]?.toString()} />
403
+ )}
226
404
  <Dialog
227
405
  visible={isDeleteImageDialogVisible}
228
406
  header="Confirm Delete"
229
407
  modal
230
408
  footer={() => (
231
409
  <div className="flex justify-content-center">
232
- <Button label="Yes" icon="pi pi-check" className='small-button' severity="danger" autoFocus onClick={handleDelete} />
410
+ <Button label="Yes" icon="pi pi-check" className='small-button' severity="danger" autoFocus onClick={deleteFile} />
233
411
  <Button label="No" icon="pi pi-times" className='small-button' onClick={() => setDeleteImageDialogVisible(false)} />
234
412
  </div>
235
413
  )}
@@ -240,4 +418,4 @@ export class SolidMediaMultipleField implements ISolidField {
240
418
  </div >
241
419
  );
242
420
  }
243
- }
421
+ }