@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.
- package/dist/components/auth/SolidForgotPassword.d.ts.map +1 -1
- package/dist/components/auth/SolidForgotPassword.js +2 -1
- package/dist/components/auth/SolidForgotPassword.js.map +1 -1
- package/dist/components/auth/SolidInitialLoginOtp.d.ts.map +1 -1
- package/dist/components/auth/SolidInitialLoginOtp.js +2 -1
- package/dist/components/auth/SolidInitialLoginOtp.js.map +1 -1
- package/dist/components/auth/SolidInitiateRegisterOtp.d.ts.map +1 -1
- package/dist/components/auth/SolidInitiateRegisterOtp.js +2 -1
- package/dist/components/auth/SolidInitiateRegisterOtp.js.map +1 -1
- package/dist/components/auth/SolidLogin.d.ts.map +1 -1
- package/dist/components/auth/SolidLogin.js +2 -1
- package/dist/components/auth/SolidLogin.js.map +1 -1
- package/dist/components/auth/SolidOTPVerify.d.ts.map +1 -1
- package/dist/components/auth/SolidOTPVerify.js +2 -1
- package/dist/components/auth/SolidOTPVerify.js.map +1 -1
- package/dist/components/auth/SolidRegister.d.ts.map +1 -1
- package/dist/components/auth/SolidRegister.js +125 -103
- package/dist/components/auth/SolidRegister.js.map +1 -1
- package/dist/components/auth/SolidResetPassword.d.ts.map +1 -1
- package/dist/components/auth/SolidResetPassword.js +2 -1
- package/dist/components/auth/SolidResetPassword.js.map +1 -1
- package/dist/components/common/DropzonePlaceholder.js +1 -1
- package/dist/components/common/DropzonePlaceholder.js.map +1 -1
- package/dist/components/common/GeneralSettings.d.ts.map +1 -1
- package/dist/components/common/GeneralSettings.js +43 -31
- package/dist/components/common/GeneralSettings.js.map +1 -1
- package/dist/components/core/common/FilterComponent.d.ts +2 -1
- package/dist/components/core/common/FilterComponent.d.ts.map +1 -1
- package/dist/components/core/common/FilterComponent.js +52 -16
- package/dist/components/core/common/FilterComponent.js.map +1 -1
- package/dist/components/core/common/SolidConfigureLayoutElement.d.ts +1 -1
- package/dist/components/core/common/SolidConfigureLayoutElement.d.ts.map +1 -1
- package/dist/components/core/common/SolidConfigureLayoutElement.js +5 -2
- package/dist/components/core/common/SolidConfigureLayoutElement.js.map +1 -1
- package/dist/components/core/common/SolidGlobalSearchElement.d.ts.map +1 -1
- package/dist/components/core/common/SolidGlobalSearchElement.js +131 -23
- package/dist/components/core/common/SolidGlobalSearchElement.js.map +1 -1
- package/dist/components/core/filter/SolidManyToOneFilterElement.d.ts.map +1 -1
- package/dist/components/core/filter/SolidManyToOneFilterElement.js +8 -6
- package/dist/components/core/filter/SolidManyToOneFilterElement.js.map +1 -1
- package/dist/components/core/filter/SolidSelectionDynamicFilterElement.js +1 -1
- package/dist/components/core/filter/SolidSelectionDynamicFilterElement.js.map +1 -1
- package/dist/components/core/filter/SolidSelectionStaticFilterElement.js +1 -1
- package/dist/components/core/filter/SolidSelectionStaticFilterElement.js.map +1 -1
- package/dist/components/core/filter/SolidVarInputsFilterElement.d.ts.map +1 -1
- package/dist/components/core/filter/SolidVarInputsFilterElement.js +11 -10
- package/dist/components/core/filter/SolidVarInputsFilterElement.js.map +1 -1
- package/dist/components/core/form/SolidFormView.d.ts.map +1 -1
- package/dist/components/core/form/SolidFormView.js +49 -14
- package/dist/components/core/form/SolidFormView.js.map +1 -1
- package/dist/components/core/form/fields/SolidBooleanField.d.ts.map +1 -1
- package/dist/components/core/form/fields/SolidBooleanField.js +9 -5
- package/dist/components/core/form/fields/SolidBooleanField.js.map +1 -1
- package/dist/components/core/form/fields/SolidDateField.d.ts.map +1 -1
- package/dist/components/core/form/fields/SolidDateField.js +12 -8
- package/dist/components/core/form/fields/SolidDateField.js.map +1 -1
- package/dist/components/core/form/fields/SolidDateTimeField.d.ts.map +1 -1
- package/dist/components/core/form/fields/SolidDateTimeField.js +12 -8
- package/dist/components/core/form/fields/SolidDateTimeField.js.map +1 -1
- package/dist/components/core/form/fields/SolidDecimalField.d.ts.map +1 -1
- package/dist/components/core/form/fields/SolidDecimalField.js +9 -5
- package/dist/components/core/form/fields/SolidDecimalField.js.map +1 -1
- package/dist/components/core/form/fields/SolidIntegerField.d.ts.map +1 -1
- package/dist/components/core/form/fields/SolidIntegerField.js +9 -5
- package/dist/components/core/form/fields/SolidIntegerField.js.map +1 -1
- package/dist/components/core/form/fields/SolidJsonField.d.ts.map +1 -1
- package/dist/components/core/form/fields/SolidJsonField.js +2 -2
- package/dist/components/core/form/fields/SolidJsonField.js.map +1 -1
- package/dist/components/core/form/fields/SolidLongTextField.d.ts.map +1 -1
- package/dist/components/core/form/fields/SolidLongTextField.js +7 -3
- package/dist/components/core/form/fields/SolidLongTextField.js.map +1 -1
- package/dist/components/core/form/fields/SolidMediaMultipleField.d.ts.map +1 -1
- package/dist/components/core/form/fields/SolidMediaMultipleField.js +155 -46
- package/dist/components/core/form/fields/SolidMediaMultipleField.js.map +1 -1
- package/dist/components/core/form/fields/SolidMediaSingleField.d.ts.map +1 -1
- package/dist/components/core/form/fields/SolidMediaSingleField.js +87 -31
- package/dist/components/core/form/fields/SolidMediaSingleField.js.map +1 -1
- package/dist/components/core/form/fields/SolidRichTextField.d.ts.map +1 -1
- package/dist/components/core/form/fields/SolidRichTextField.js +2 -2
- package/dist/components/core/form/fields/SolidRichTextField.js.map +1 -1
- package/dist/components/core/form/fields/SolidSelectionDynamicField.d.ts.map +1 -1
- package/dist/components/core/form/fields/SolidSelectionDynamicField.js +4 -4
- package/dist/components/core/form/fields/SolidSelectionDynamicField.js.map +1 -1
- package/dist/components/core/form/fields/SolidSelectionStaticField.d.ts.map +1 -1
- package/dist/components/core/form/fields/SolidSelectionStaticField.js +18 -9
- package/dist/components/core/form/fields/SolidSelectionStaticField.js.map +1 -1
- package/dist/components/core/form/fields/SolidShortTextField.d.ts.map +1 -1
- package/dist/components/core/form/fields/SolidShortTextField.js +7 -3
- package/dist/components/core/form/fields/SolidShortTextField.js.map +1 -1
- package/dist/components/core/form/fields/SolidTimeField.d.ts.map +1 -1
- package/dist/components/core/form/fields/SolidTimeField.js +12 -8
- package/dist/components/core/form/fields/SolidTimeField.js.map +1 -1
- package/dist/components/core/form/fields/relations/SolidRelationManyToManyField.js +22 -15
- package/dist/components/core/form/fields/relations/SolidRelationManyToManyField.js.map +1 -1
- package/dist/components/core/form/fields/relations/SolidRelationManyToOneField.d.ts.map +1 -1
- package/dist/components/core/form/fields/relations/SolidRelationManyToOneField.js +11 -8
- package/dist/components/core/form/fields/relations/SolidRelationManyToOneField.js.map +1 -1
- package/dist/components/core/form/fields/relations/SolidRelationOneToManyField.js +2 -2
- package/dist/components/core/form/fields/relations/SolidRelationOneToManyField.js.map +1 -1
- package/dist/components/core/list/SolidListView.d.ts.map +1 -1
- package/dist/components/core/list/SolidListView.js +88 -63
- package/dist/components/core/list/SolidListView.js.map +1 -1
- package/dist/components/core/list/SolidManyToOneFilterElement.js +7 -5
- package/dist/components/core/list/SolidManyToOneFilterElement.js.map +1 -1
- package/dist/components/core/list/columns/SolidBooleanColumn.js +3 -1
- package/dist/components/core/list/columns/SolidBooleanColumn.js.map +1 -1
- package/dist/components/core/list/columns/relations/SolidRelationManyToOneColumn.js +2 -1
- package/dist/components/core/list/columns/relations/SolidRelationManyToOneColumn.js.map +1 -1
- package/dist/components/core/model/CreateModel.d.ts.map +1 -1
- package/dist/components/core/model/CreateModel.js +20 -16
- package/dist/components/core/model/CreateModel.js.map +1 -1
- package/dist/components/core/model/FieldMetaDataForm.d.ts.map +1 -1
- package/dist/components/core/model/FieldMetaDataForm.js +67 -54
- package/dist/components/core/model/FieldMetaDataForm.js.map +1 -1
- package/dist/components/core/model/FieldSelector.js +1 -1
- package/dist/components/core/model/FieldSelector.js.map +1 -1
- package/dist/components/core/model/ModelMetaData.d.ts.map +1 -1
- package/dist/components/core/model/ModelMetaData.js +12 -17
- package/dist/components/core/model/ModelMetaData.js.map +1 -1
- package/dist/components/core/module/CreateModule.d.ts.map +1 -1
- package/dist/components/core/module/CreateModule.js +23 -23
- package/dist/components/core/module/CreateModule.js.map +1 -1
- package/dist/components/layout/AppSidebar.d.ts.map +1 -1
- package/dist/components/layout/AppSidebar.js +42 -11
- package/dist/components/layout/AppSidebar.js.map +1 -1
- package/dist/components/layout/navbar-two-menu.d.ts.map +1 -1
- package/dist/components/layout/navbar-two-menu.js +6 -2
- package/dist/components/layout/navbar-two-menu.js.map +1 -1
- package/dist/components/layout/user-profile-menu.d.ts.map +1 -1
- package/dist/components/layout/user-profile-menu.js +7 -3
- package/dist/components/layout/user-profile-menu.js.map +1 -1
- package/dist/helpers/AppTitle.d.ts +4 -0
- package/dist/helpers/AppTitle.d.ts.map +1 -0
- package/dist/helpers/AppTitle.js +8 -0
- package/dist/helpers/AppTitle.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/components/auth/SolidForgotPassword.tsx +2 -6
- package/src/components/auth/SolidInitialLoginOtp.tsx +2 -6
- package/src/components/auth/SolidInitiateRegisterOtp.tsx +2 -6
- package/src/components/auth/SolidLogin.tsx +2 -5
- package/src/components/auth/SolidOTPVerify.tsx +4 -7
- package/src/components/auth/SolidRegister.tsx +207 -178
- package/src/components/auth/SolidResetPassword.tsx +2 -6
- package/src/components/common/DropzonePlaceholder.tsx +1 -1
- package/src/components/common/GeneralSettings.tsx +310 -193
- package/src/components/core/common/FilterComponent.tsx +148 -202
- package/src/components/core/common/SolidConfigureLayoutElement.tsx +6 -4
- package/src/components/core/common/SolidGlobalSearchElement.tsx +193 -50
- package/src/components/core/filter/SolidManyToOneFilterElement.tsx +5 -3
- package/src/components/core/filter/SolidSelectionDynamicFilterElement.tsx +1 -1
- package/src/components/core/filter/SolidSelectionStaticFilterElement.tsx +1 -1
- package/src/components/core/filter/SolidVarInputsFilterElement.tsx +103 -135
- package/src/components/core/form/SolidFormView.tsx +64 -25
- package/src/components/core/form/fields/SolidBooleanField.tsx +12 -5
- package/src/components/core/form/fields/SolidDateField.tsx +9 -4
- package/src/components/core/form/fields/SolidDateTimeField.tsx +27 -21
- package/src/components/core/form/fields/SolidDecimalField.tsx +9 -2
- package/src/components/core/form/fields/SolidIntegerField.tsx +22 -15
- package/src/components/core/form/fields/SolidJsonField.tsx +14 -12
- package/src/components/core/form/fields/SolidLongTextField.tsx +22 -16
- package/src/components/core/form/fields/SolidMediaMultipleField.tsx +257 -79
- package/src/components/core/form/fields/SolidMediaSingleField.tsx +148 -61
- package/src/components/core/form/fields/SolidRichTextField.tsx +6 -4
- package/src/components/core/form/fields/SolidSelectionDynamicField.tsx +6 -5
- package/src/components/core/form/fields/SolidSelectionStaticField.tsx +34 -23
- package/src/components/core/form/fields/SolidShortTextField.tsx +23 -16
- package/src/components/core/form/fields/SolidTimeField.tsx +27 -20
- package/src/components/core/form/fields/relations/SolidRelationManyToManyField.tsx +9 -9
- package/src/components/core/form/fields/relations/SolidRelationManyToOneField.tsx +20 -19
- package/src/components/core/form/fields/relations/SolidRelationOneToManyField.tsx +2 -2
- package/src/components/core/list/SolidListView.tsx +91 -49
- package/src/components/core/list/SolidManyToOneFilterElement.tsx +2 -2
- package/src/components/core/list/columns/SolidBooleanColumn.tsx +2 -2
- package/src/components/core/list/columns/relations/SolidRelationManyToOneColumn.tsx +1 -1
- package/src/components/core/model/CreateModel.tsx +92 -81
- package/src/components/core/model/FieldMetaDataForm.tsx +166 -87
- package/src/components/core/model/FieldSelector.tsx +1 -1
- package/src/components/core/model/ModelMetaData.tsx +8 -7
- package/src/components/core/module/CreateModule.tsx +181 -183
- package/src/components/layout/AppSidebar.tsx +35 -10
- package/src/components/layout/navbar-two-menu.tsx +6 -1
- package/src/components/layout/user-profile-menu.tsx +20 -8
- package/src/helpers/AppTitle.tsx +14 -0
- 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-
|
|
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
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
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
|
-
|
|
113
|
-
if (
|
|
114
|
-
const
|
|
115
|
-
const
|
|
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
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
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
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
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
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
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:
|
|
152
|
-
accept: {
|
|
153
|
-
|
|
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
|
-
<
|
|
271
|
+
<div className="flex flex-column gap-2 mt-4">
|
|
272
|
+
<label htmlFor={fieldLayoutInfo.attrs.name} className="form-field-label">{fieldLabel}
|
|
175
273
|
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
/>
|
|
184
|
-
{isDragActive ? (
|
|
274
|
+
{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
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
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
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
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
|
-
|
|
218
|
-
) :
|
|
219
|
-
<DropzonePlaceholder />
|
|
397
|
+
);
|
|
398
|
+
})
|
|
220
399
|
}
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
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={
|
|
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
|
+
}
|