@solidstarters/solid-core-ui 1.1.18 → 1.1.19
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/Svg/FileSvg.d.ts +4 -0
- package/dist/components/Svg/FileSvg.d.ts.map +1 -0
- package/dist/components/Svg/FileSvg.js +15 -0
- package/dist/components/Svg/FileSvg.js.map +1 -0
- package/dist/components/auth/AuthLayout.d.ts.map +1 -1
- package/dist/components/auth/AuthLayout.js +6 -6
- package/dist/components/auth/AuthLayout.js.map +1 -1
- package/dist/components/auth/SolidForgotPassword.js +1 -1
- package/dist/components/auth/SolidForgotPassword.js.map +1 -1
- package/dist/components/auth/SolidInitialLoginOtp.js +1 -1
- package/dist/components/auth/SolidInitialLoginOtp.js.map +1 -1
- package/dist/components/auth/SolidInitiateRegisterOtp.js +1 -1
- package/dist/components/auth/SolidInitiateRegisterOtp.js.map +1 -1
- package/dist/components/auth/SolidResetPassword.js +1 -1
- package/dist/components/auth/SolidResetPassword.js.map +1 -1
- package/dist/components/common/DropzonePlaceholder.d.ts +6 -1
- package/dist/components/common/DropzonePlaceholder.d.ts.map +1 -1
- package/dist/components/common/DropzonePlaceholder.js +8 -2
- package/dist/components/common/DropzonePlaceholder.js.map +1 -1
- package/dist/components/common/FileReaderExt.d.ts.map +1 -1
- package/dist/components/common/FileReaderExt.js +2 -1
- package/dist/components/common/FileReaderExt.js.map +1 -1
- package/dist/components/core/common/SolidConfigureLayoutElement.d.ts.map +1 -1
- package/dist/components/core/common/SolidConfigureLayoutElement.js +28 -6
- 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 +3 -3
- package/dist/components/core/common/SolidGlobalSearchElement.js.map +1 -1
- package/dist/components/core/form/SolidFormView.js +3 -5
- package/dist/components/core/form/SolidFormView.js.map +1 -1
- package/dist/components/core/form/fields/SolidMediaMultipleField.d.ts.map +1 -1
- package/dist/components/core/form/fields/SolidMediaMultipleField.js +66 -64
- 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 +72 -91
- package/dist/components/core/form/fields/SolidMediaSingleField.js.map +1 -1
- package/dist/components/core/model/CreateModel.js +3 -4
- package/dist/components/core/model/CreateModel.js.map +1 -1
- package/dist/components/core/module/CreateModule.js +3 -4
- package/dist/components/core/module/CreateModule.js.map +1 -1
- package/dist/components/core/users/CreateUser.js +1 -2
- package/dist/components/core/users/CreateUser.js.map +1 -1
- package/dist/components/layout/AppConfig.js +1 -1
- package/dist/components/layout/navbar-two-menu.js +1 -1
- package/dist/components/layout/user-profile-menu.d.ts.map +1 -1
- package/dist/components/layout/user-profile-menu.js +1 -1
- package/dist/components/layout/user-profile-menu.js.map +1 -1
- package/dist/helpers/downloadMediaFile.d.ts +2 -0
- package/dist/helpers/downloadMediaFile.d.ts.map +1 -0
- package/dist/helpers/downloadMediaFile.js +66 -0
- package/dist/helpers/downloadMediaFile.js.map +1 -0
- package/dist/helpers/getAcceptedFileTypes.d.ts +4 -0
- package/dist/helpers/getAcceptedFileTypes.d.ts.map +1 -0
- package/dist/helpers/getAcceptedFileTypes.js +20 -0
- package/dist/helpers/getAcceptedFileTypes.js.map +1 -0
- package/dist/index.js +2 -2
- package/dist/nextAuth/authProviders.d.ts.map +1 -1
- package/dist/nextAuth/authProviders.js +15 -10
- package/dist/nextAuth/authProviders.js.map +1 -1
- package/dist/stylesheets/globals.css +2476 -0
- package/dist/stylesheets/styles/SF-Pro-Display-Regular.otf +0 -0
- package/dist/stylesheets/styles/layout/_config.scss +54 -0
- package/dist/stylesheets/styles/layout/_content.scss +77 -0
- package/dist/stylesheets/styles/layout/_footer.scss +8 -0
- package/dist/stylesheets/styles/layout/_main.scss +47 -0
- package/dist/stylesheets/styles/layout/_menu.scss +185 -0
- package/dist/stylesheets/styles/layout/_mixins.scss +13 -0
- package/dist/stylesheets/styles/layout/_responsive.scss +99 -0
- package/dist/stylesheets/styles/layout/_topbar.scss +149 -0
- package/dist/stylesheets/styles/layout/_typography.scss +63 -0
- package/dist/stylesheets/styles/layout/_utils.scss +27 -0
- package/dist/stylesheets/styles/layout/_variables.scss +3 -0
- package/dist/stylesheets/styles/layout/layout.scss +11 -0
- package/dist/stylesheets/themes/solid-dark-purple/fonts/SF-Pro-Display-Black.otf +0 -0
- package/dist/stylesheets/themes/solid-dark-purple/fonts/SF-Pro-Display-Bold.otf +0 -0
- package/dist/stylesheets/themes/solid-dark-purple/fonts/SF-Pro-Display-Heavy.otf +0 -0
- package/dist/stylesheets/themes/solid-dark-purple/fonts/SF-Pro-Display-Light.otf +0 -0
- package/dist/stylesheets/themes/solid-dark-purple/fonts/SF-Pro-Display-Medium.otf +0 -0
- package/dist/stylesheets/themes/solid-dark-purple/fonts/SF-Pro-Display-Regular.otf +0 -0
- package/dist/stylesheets/themes/solid-dark-purple/fonts/SF-Pro-Display-Semibold.otf +0 -0
- package/dist/stylesheets/themes/solid-dark-purple/fonts/SF-Pro-Display-Thin.otf +0 -0
- package/dist/stylesheets/themes/solid-dark-purple/fonts/SF-Pro-Display-Ultralight.otf +0 -0
- package/dist/stylesheets/themes/solid-dark-purple/theme.css +9051 -0
- package/dist/stylesheets/themes/solid-light-purple/fonts/SF-Pro-Display-Black.otf +0 -0
- package/dist/stylesheets/themes/solid-light-purple/fonts/SF-Pro-Display-Bold.otf +0 -0
- package/dist/stylesheets/themes/solid-light-purple/fonts/SF-Pro-Display-Heavy.otf +0 -0
- package/dist/stylesheets/themes/solid-light-purple/fonts/SF-Pro-Display-Light.otf +0 -0
- package/dist/stylesheets/themes/solid-light-purple/fonts/SF-Pro-Display-Medium.otf +0 -0
- package/dist/stylesheets/themes/solid-light-purple/fonts/SF-Pro-Display-Regular.otf +0 -0
- package/dist/stylesheets/themes/solid-light-purple/fonts/SF-Pro-Display-Semibold.otf +0 -0
- package/dist/stylesheets/themes/solid-light-purple/fonts/SF-Pro-Display-Thin.otf +0 -0
- package/dist/stylesheets/themes/solid-light-purple/fonts/SF-Pro-Display-Ultralight.otf +0 -0
- package/dist/stylesheets/themes/solid-light-purple/theme.css +9077 -0
- package/package.json +1 -1
- package/src/components/Svg/FileSvg.tsx +18 -0
- package/src/components/auth/AuthLayout.tsx +7 -5
- package/src/components/auth/SolidForgotPassword.tsx +1 -1
- package/src/components/auth/SolidInitialLoginOtp.tsx +1 -1
- package/src/components/auth/SolidInitiateRegisterOtp.tsx +1 -1
- package/src/components/auth/SolidResetPassword.tsx +1 -1
- package/src/components/common/DropzonePlaceholder.tsx +22 -9
- package/src/components/common/FileReaderExt.tsx +5 -3
- package/src/components/core/common/SolidConfigureLayoutElement.tsx +72 -31
- package/src/components/core/common/SolidGlobalSearchElement.tsx +4 -3
- package/src/components/core/form/SolidFormView.tsx +4 -4
- package/src/components/core/form/fields/SolidMediaMultipleField.tsx +116 -95
- package/src/components/core/form/fields/SolidMediaSingleField.tsx +109 -123
- package/src/components/core/model/CreateModel.tsx +4 -4
- package/src/components/core/module/CreateModule.tsx +4 -4
- package/src/components/core/users/CreateUser.tsx +2 -2
- package/src/components/layout/AppConfig.tsx +1 -1
- package/src/components/layout/navbar-two-menu.tsx +1 -1
- package/src/components/layout/user-profile-menu.tsx +7 -8
- package/src/helpers/downloadMediaFile.tsx +19 -0
- package/src/helpers/getAcceptedFileTypes.tsx +22 -0
- package/src/nextAuth/authProviders.tsx +3 -2
- package/dist/components/common/FilterComponent.d.ts +0 -3
- package/dist/components/common/FilterComponent.d.ts.map +0 -1
- package/dist/components/common/FilterComponent.js +0 -214
- package/dist/components/common/FilterComponent.js.map +0 -1
- package/dist/components/core/filter/columns/SolidBigintField.d.ts +0 -4
- package/dist/components/core/filter/columns/SolidBigintField.d.ts.map +0 -1
- package/dist/components/core/filter/columns/SolidBigintField.js +0 -8
- package/dist/components/core/filter/columns/SolidBigintField.js.map +0 -1
- package/dist/components/core/filter/columns/SolidBooleanField.d.ts +0 -4
- package/dist/components/core/filter/columns/SolidBooleanField.d.ts.map +0 -1
- package/dist/components/core/filter/columns/SolidBooleanField.js +0 -27
- package/dist/components/core/filter/columns/SolidBooleanField.js.map +0 -1
- package/dist/components/core/filter/columns/SolidComputedField.d.ts +0 -4
- package/dist/components/core/filter/columns/SolidComputedField.d.ts.map +0 -1
- package/dist/components/core/filter/columns/SolidComputedField.js +0 -22
- package/dist/components/core/filter/columns/SolidComputedField.js.map +0 -1
- package/dist/components/core/filter/columns/SolidDateField.d.ts +0 -9
- package/dist/components/core/filter/columns/SolidDateField.d.ts.map +0 -1
- package/dist/components/core/filter/columns/SolidDateField.js +0 -35
- package/dist/components/core/filter/columns/SolidDateField.js.map +0 -1
- package/dist/components/core/filter/columns/SolidDatetimeField.d.ts +0 -4
- package/dist/components/core/filter/columns/SolidDatetimeField.d.ts.map +0 -1
- package/dist/components/core/filter/columns/SolidDatetimeField.js +0 -24
- package/dist/components/core/filter/columns/SolidDatetimeField.js.map +0 -1
- package/dist/components/core/filter/columns/SolidDecimalField.d.ts +0 -4
- package/dist/components/core/filter/columns/SolidDecimalField.d.ts.map +0 -1
- package/dist/components/core/filter/columns/SolidDecimalField.js +0 -8
- package/dist/components/core/filter/columns/SolidDecimalField.js.map +0 -1
- package/dist/components/core/filter/columns/SolidExternalIdField.d.ts +0 -4
- package/dist/components/core/filter/columns/SolidExternalIdField.d.ts.map +0 -1
- package/dist/components/core/filter/columns/SolidExternalIdField.js +0 -25
- package/dist/components/core/filter/columns/SolidExternalIdField.js.map +0 -1
- package/dist/components/core/filter/columns/SolidFloatField.d.ts +0 -4
- package/dist/components/core/filter/columns/SolidFloatField.d.ts.map +0 -1
- package/dist/components/core/filter/columns/SolidFloatField.js +0 -8
- package/dist/components/core/filter/columns/SolidFloatField.js.map +0 -1
- package/dist/components/core/filter/columns/SolidIdField.d.ts +0 -4
- package/dist/components/core/filter/columns/SolidIdField.d.ts.map +0 -1
- package/dist/components/core/filter/columns/SolidIdField.js +0 -25
- package/dist/components/core/filter/columns/SolidIdField.js.map +0 -1
- package/dist/components/core/filter/columns/SolidIntField.d.ts +0 -4
- package/dist/components/core/filter/columns/SolidIntField.d.ts.map +0 -1
- package/dist/components/core/filter/columns/SolidIntField.js +0 -34
- package/dist/components/core/filter/columns/SolidIntField.js.map +0 -1
- package/dist/components/core/filter/columns/SolidLongTextField.d.ts +0 -4
- package/dist/components/core/filter/columns/SolidLongTextField.d.ts.map +0 -1
- package/dist/components/core/filter/columns/SolidLongTextField.js +0 -8
- package/dist/components/core/filter/columns/SolidLongTextField.js.map +0 -1
- package/dist/components/core/filter/columns/SolidMediaMultipleField.d.ts +0 -4
- package/dist/components/core/filter/columns/SolidMediaMultipleField.d.ts.map +0 -1
- package/dist/components/core/filter/columns/SolidMediaMultipleField.js +0 -35
- package/dist/components/core/filter/columns/SolidMediaMultipleField.js.map +0 -1
- package/dist/components/core/filter/columns/SolidMediaSingleField.d.ts +0 -4
- package/dist/components/core/filter/columns/SolidMediaSingleField.d.ts.map +0 -1
- package/dist/components/core/filter/columns/SolidMediaSingleField.js +0 -35
- package/dist/components/core/filter/columns/SolidMediaSingleField.js.map +0 -1
- package/dist/components/core/filter/columns/SolidRelationField.d.ts +0 -4
- package/dist/components/core/filter/columns/SolidRelationField.d.ts.map +0 -1
- package/dist/components/core/filter/columns/SolidRelationField.js +0 -12
- package/dist/components/core/filter/columns/SolidRelationField.js.map +0 -1
- package/dist/components/core/filter/columns/SolidRichTextField.d.ts +0 -4
- package/dist/components/core/filter/columns/SolidRichTextField.d.ts.map +0 -1
- package/dist/components/core/filter/columns/SolidRichTextField.js +0 -8
- package/dist/components/core/filter/columns/SolidRichTextField.js.map +0 -1
- package/dist/components/core/filter/columns/SolidSelectionDynamicField.d.ts +0 -4
- package/dist/components/core/filter/columns/SolidSelectionDynamicField.d.ts.map +0 -1
- package/dist/components/core/filter/columns/SolidSelectionDynamicField.js +0 -25
- package/dist/components/core/filter/columns/SolidSelectionDynamicField.js.map +0 -1
- package/dist/components/core/filter/columns/SolidSelectionStaticField.d.ts +0 -4
- package/dist/components/core/filter/columns/SolidSelectionStaticField.d.ts.map +0 -1
- package/dist/components/core/filter/columns/SolidSelectionStaticField.js +0 -26
- package/dist/components/core/filter/columns/SolidSelectionStaticField.js.map +0 -1
- package/dist/components/core/filter/columns/SolidShortTextField.d.ts +0 -4
- package/dist/components/core/filter/columns/SolidShortTextField.d.ts.map +0 -1
- package/dist/components/core/filter/columns/SolidShortTextField.js +0 -33
- package/dist/components/core/filter/columns/SolidShortTextField.js.map +0 -1
- package/dist/components/core/filter/columns/SolidTimeField.d.ts +0 -4
- package/dist/components/core/filter/columns/SolidTimeField.d.ts.map +0 -1
- package/dist/components/core/filter/columns/SolidTimeField.js +0 -24
- package/dist/components/core/filter/columns/SolidTimeField.js.map +0 -1
- package/dist/components/core/filter/columns/SolidUuidField.d.ts +0 -4
- package/dist/components/core/filter/columns/SolidUuidField.d.ts.map +0 -1
- package/dist/components/core/filter/columns/SolidUuidField.js +0 -25
- package/dist/components/core/filter/columns/SolidUuidField.js.map +0 -1
- package/dist/components/core/filter/columns/relations/SolidRelationManyToOneField.d.ts +0 -4
- package/dist/components/core/filter/columns/relations/SolidRelationManyToOneField.d.ts.map +0 -1
- package/dist/components/core/filter/columns/relations/SolidRelationManyToOneField.js +0 -54
- package/dist/components/core/filter/columns/relations/SolidRelationManyToOneField.js.map +0 -1
|
@@ -11,6 +11,10 @@ import { Schema } from "yup";
|
|
|
11
11
|
import { FormikObject, ISolidField, SolidFieldProps } from "./ISolidField";
|
|
12
12
|
import { FileReaderExt } from "@/components/common/FileReaderExt";
|
|
13
13
|
import { ProgressBar } from "primereact/progressbar";
|
|
14
|
+
import Link from "next/link";
|
|
15
|
+
import getAcceptedFileTypes from "@/helpers/getAcceptedFileTypes";
|
|
16
|
+
import { downloadMediaFile } from "@/helpers/downloadMediaFile";
|
|
17
|
+
|
|
14
18
|
export class SolidMediaSingleField implements ISolidField {
|
|
15
19
|
|
|
16
20
|
private fieldContext: SolidFieldProps;
|
|
@@ -82,12 +86,11 @@ export class SolidMediaSingleField implements ISolidField {
|
|
|
82
86
|
|
|
83
87
|
const [isDeleteImageDialogVisible, setDeleteImageDialogVisible] = useState(false);
|
|
84
88
|
const [imageToBeDeletedData, setImageToBeDeletedData] = useState<any>();
|
|
85
|
-
const [imagesPreview, setImagesPreview] = useState<string | ArrayBuffer | null>(null);
|
|
86
|
-
const [uploadProgress, setUploadProgress] = useState<number>(0);
|
|
87
89
|
const [uploadCompleted, setUploadCompleted] = useState<boolean>(false);
|
|
88
|
-
const [fileDetails, setFileDetails] = useState<{ name: string; type: string } | null>(null);
|
|
89
|
-
const [uploadedSize, setUploadedSize] = useState<string>("0 MB");
|
|
90
|
+
const [fileDetails, setFileDetails] = useState<{ name: string; type: string, fileUrl: string } | null>(null);
|
|
90
91
|
const [totalSize, setTotalSize] = useState<string>("0 KB");
|
|
92
|
+
const [isReplaceImageDialogVisible, setReplaceImageDialogVisible] = useState(false);
|
|
93
|
+
const [newFileToUpload, setNewFileToUpload] = useState<any>(null);
|
|
91
94
|
|
|
92
95
|
const formatFileSize = (size: number) => {
|
|
93
96
|
return size >= 1024 * 1024
|
|
@@ -95,139 +98,104 @@ export class SolidMediaSingleField implements ISolidField {
|
|
|
95
98
|
: `${(size / 1024).toFixed(1)} KB`;
|
|
96
99
|
};
|
|
97
100
|
|
|
98
|
-
const fieldDisabled = fieldLayoutInfo.attrs?.disabled;
|
|
99
|
-
const fieldReadonly = fieldLayoutInfo.attrs?.readonly;
|
|
100
|
-
|
|
101
|
-
const formDisabled = solidFormViewMetaData.data.solidView?.layout?.attrs?.disabled;
|
|
102
|
-
const formReadonly = solidFormViewMetaData.data.solidView?.layout?.attrs?.readonly;
|
|
103
|
-
|
|
104
101
|
const [
|
|
105
102
|
deleteMedia,
|
|
106
103
|
{ isLoading: isMediaDeleted, isSuccess: isDeleteMediaSuceess, isError: isMediaDeleteError, error: mediaDeleteError, data: DeletedMedia },
|
|
107
104
|
] = useDeleteMediaMutation();
|
|
108
105
|
|
|
109
|
-
const handleDelete = () => {
|
|
110
|
-
imageToBeDeletedData.e.stopPropagation();
|
|
111
|
-
if (imageToBeDeletedData.imagesPreview.id) {
|
|
112
|
-
deleteMedia(imageToBeDeletedData.imagesPreview.id);
|
|
113
|
-
}
|
|
114
|
-
formik.setFieldValue(fieldLayoutInfo.attrs.name, null);
|
|
115
|
-
setDeleteImageDialogVisible(false);
|
|
116
|
-
};
|
|
117
106
|
const handleCancelUpload = (e: React.MouseEvent) => {
|
|
118
107
|
e.stopPropagation();
|
|
119
108
|
if (imageToBeDeletedData) {
|
|
120
109
|
deleteMedia(imageToBeDeletedData);
|
|
121
110
|
}
|
|
122
111
|
e.stopPropagation();
|
|
123
|
-
setUploadProgress(0);
|
|
124
112
|
setUploadCompleted(false);
|
|
125
113
|
setFileDetails(null);
|
|
126
114
|
formik.setFieldValue(fieldLayoutInfo.attrs.name, null);
|
|
127
115
|
setDeleteImageDialogVisible(false);
|
|
128
116
|
};
|
|
129
117
|
|
|
130
|
-
const handleDropImage = (acceptedFiles:
|
|
131
|
-
// const file = acceptedFiles[0];
|
|
132
|
-
// if (file) {
|
|
133
|
-
// formik.setFieldValue(fieldLayoutInfo.attrs.name, file);
|
|
134
|
-
// } else {
|
|
135
|
-
// console.error("No file was accepted");
|
|
136
|
-
// }
|
|
118
|
+
const handleDropImage = (acceptedFiles: any[]) => {
|
|
137
119
|
const file = acceptedFiles[0];
|
|
138
120
|
if (!file) return;
|
|
121
|
+
if (fileDetails) {
|
|
122
|
+
// If a file is already uploaded, show the confirmation dialog
|
|
123
|
+
setNewFileToUpload(file);
|
|
124
|
+
setReplaceImageDialogVisible(true);
|
|
125
|
+
} else {
|
|
126
|
+
// If no file is present, proceed with upload
|
|
127
|
+
uploadFile(file);
|
|
128
|
+
}
|
|
129
|
+
};
|
|
139
130
|
|
|
131
|
+
const uploadFile = (file: any) => {
|
|
140
132
|
setUploadCompleted(false);
|
|
141
|
-
setUploadProgress(0);
|
|
142
133
|
setTotalSize(formatFileSize(file.size));
|
|
143
|
-
|
|
144
|
-
setFileDetails({ name: file.name, type: file.type });
|
|
134
|
+
setFileDetails({ name: file.name, type: file.type, fileUrl: file.fileUrl });
|
|
145
135
|
|
|
146
136
|
const reader = new FileReader();
|
|
147
|
-
|
|
148
|
-
reader.onloadstart = () => {
|
|
149
|
-
setUploadProgress(0);
|
|
150
|
-
setUploadedSize("0 KB");
|
|
151
|
-
};
|
|
152
|
-
reader.onprogress = (event) => {
|
|
153
|
-
if (event.loaded && event.total) {
|
|
154
|
-
const percent = Math.round((event.loaded / event.total) * 100);
|
|
155
|
-
setUploadProgress(percent);
|
|
156
|
-
setUploadedSize(formatFileSize(event.loaded));
|
|
157
|
-
}
|
|
158
|
-
};
|
|
159
|
-
|
|
160
137
|
reader.onloadend = () => {
|
|
161
|
-
setUploadProgress(100);
|
|
162
138
|
setUploadCompleted(true);
|
|
163
|
-
setUploadedSize(totalSize); // Set uploaded size to total size after completion
|
|
164
139
|
};
|
|
165
|
-
|
|
166
140
|
reader.readAsDataURL(file);
|
|
167
141
|
formik.setFieldValue(fieldLayoutInfo.attrs.name, file);
|
|
168
142
|
};
|
|
143
|
+
const handleReplaceFile = () => {
|
|
144
|
+
// Delete the existing file first
|
|
145
|
+
if (imageToBeDeletedData) {
|
|
146
|
+
deleteMedia(imageToBeDeletedData);
|
|
147
|
+
}
|
|
169
148
|
|
|
170
|
-
|
|
171
|
-
|
|
149
|
+
setUploadCompleted(false);
|
|
150
|
+
setFileDetails(null);
|
|
151
|
+
formik.setFieldValue(fieldLayoutInfo.attrs.name, null);
|
|
172
152
|
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
// }
|
|
182
|
-
// }, [formik.values, fieldLayoutInfo.attrs.name]);
|
|
153
|
+
// Proceed with uploading new file
|
|
154
|
+
if (newFileToUpload) {
|
|
155
|
+
uploadFile(newFileToUpload);
|
|
156
|
+
setNewFileToUpload(null);
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
setReplaceImageDialogVisible(false);
|
|
160
|
+
};
|
|
183
161
|
useEffect(() => {
|
|
184
162
|
const fieldValue = formik?.values[fieldLayoutInfo.attrs.name];
|
|
185
163
|
|
|
186
164
|
if (fieldValue && typeof fieldValue === "object") {
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
165
|
+
let fileUrl = "";
|
|
166
|
+
let fileName = "Unknown File";
|
|
167
|
+
|
|
168
|
+
if (fieldValue instanceof File) {
|
|
169
|
+
// Handle new file upload
|
|
170
|
+
fileUrl = fieldValue.name;
|
|
171
|
+
fileName = fileUrl;
|
|
172
|
+
} else if (fieldValue._full_url) {
|
|
173
|
+
// Handle updated file from backend
|
|
174
|
+
fileUrl = fieldValue._full_url;
|
|
175
|
+
fileName = fieldValue.relativeUri?.split("/").pop() || "Unknown File";
|
|
198
176
|
}
|
|
177
|
+
|
|
178
|
+
setFileDetails({ name: fileName, type: "Uploaded File", fileUrl });
|
|
179
|
+
|
|
180
|
+
// Set upload progress
|
|
181
|
+
setUploadCompleted(true);
|
|
182
|
+
setImageToBeDeletedData(fieldValue.id);
|
|
183
|
+
formik.setFieldValue(fieldLayoutInfo.attrs.name, fieldValue);
|
|
199
184
|
}
|
|
200
185
|
}, [formik.values, fieldLayoutInfo.attrs.name]);
|
|
201
186
|
|
|
202
|
-
|
|
203
187
|
const {
|
|
204
188
|
getRootProps: getRootProps,
|
|
205
189
|
getInputProps: getInputProps,
|
|
206
190
|
isDragActive: isDragActive,
|
|
207
191
|
} = useDropzone({
|
|
208
192
|
onDrop: handleDropImage,
|
|
209
|
-
accept:
|
|
210
|
-
|
|
211
|
-
"image/png": [],
|
|
212
|
-
},
|
|
213
|
-
maxSize: 2 * 1024 * 1024, // 2MB
|
|
193
|
+
accept: getAcceptedFileTypes(fieldMetadata.mediaTypes),
|
|
194
|
+
maxSize: fieldMetadata.mediaMaxSizeKb * 1024,
|
|
214
195
|
});
|
|
215
196
|
|
|
216
197
|
const isFormFieldValid = (formik: any, fieldName: string) => formik.touched[fieldName] && formik.errors[fieldName];
|
|
217
198
|
|
|
218
|
-
const imageFormatHandler = (preview: any) => {
|
|
219
|
-
if (typeof preview === 'string') {
|
|
220
|
-
return preview; // Existing URLs
|
|
221
|
-
}
|
|
222
|
-
if (preview instanceof File) {
|
|
223
|
-
return URL.createObjectURL(preview); // Generate preview URL for File
|
|
224
|
-
}
|
|
225
|
-
if (typeof preview === 'object') {
|
|
226
|
-
return preview._full_url
|
|
227
|
-
}
|
|
228
|
-
return ""; // Fallback for invalid cases
|
|
229
|
-
}
|
|
230
|
-
|
|
231
199
|
return (
|
|
232
200
|
<div className={className}>
|
|
233
201
|
<div className="flex flex-column gap-2 mt-4">
|
|
@@ -241,7 +209,10 @@ export class SolidMediaSingleField implements ISolidField {
|
|
|
241
209
|
className="solid-dropzone-wrapper"
|
|
242
210
|
>
|
|
243
211
|
<input {...getInputProps()} />
|
|
244
|
-
<DropzonePlaceholder
|
|
212
|
+
<DropzonePlaceholder
|
|
213
|
+
mediaTypes={fieldMetadata.mediaTypes}
|
|
214
|
+
mediaMaxSizeKb={fieldMetadata.mediaMaxSizeKb}
|
|
215
|
+
/>
|
|
245
216
|
</div>
|
|
246
217
|
{isFormFieldValid(formik, fieldLayoutInfo.attrs.name) && (
|
|
247
218
|
<Message severity="error" text={formik?.errors[fieldLayoutInfo.attrs.name]?.toString()} />
|
|
@@ -251,46 +222,47 @@ export class SolidMediaSingleField implements ISolidField {
|
|
|
251
222
|
<div className="flex align-items-center gap-2">
|
|
252
223
|
<FileReaderExt fileDetails={fileDetails} />
|
|
253
224
|
<div className="w-full flex flex-column gap-1">
|
|
254
|
-
<div className="flex align-items-
|
|
255
|
-
<
|
|
256
|
-
<div className="
|
|
257
|
-
<
|
|
258
|
-
<
|
|
259
|
-
|
|
225
|
+
<div className="flex align-items-start justify-content-between">
|
|
226
|
+
<Link className="font-bold w-9" href={process.env.NEXT_PUBLIC_BACKEND_API_URL + `/${fileDetails?.fileUrl}`} target="_blank">{fileDetails.name}</Link>
|
|
227
|
+
<div className="flex align-items-center gap-2">
|
|
228
|
+
<div>
|
|
229
|
+
<Button
|
|
230
|
+
text
|
|
231
|
+
icon={"pi pi-download"}
|
|
232
|
+
size="small"
|
|
233
|
+
severity="secondary"
|
|
234
|
+
// className="p-2"
|
|
235
|
+
style={{
|
|
236
|
+
height: 16,
|
|
237
|
+
width: 16
|
|
238
|
+
}}
|
|
239
|
+
onClick={() => downloadMediaFile(fileDetails?.fileUrl, fileDetails?.name)}
|
|
240
|
+
/>
|
|
241
|
+
</div>
|
|
242
|
+
<div>
|
|
243
|
+
<Button
|
|
244
|
+
text
|
|
245
|
+
icon={"pi pi-times"}
|
|
246
|
+
size="small"
|
|
247
|
+
severity="secondary"
|
|
248
|
+
// className="p-2"
|
|
249
|
+
style={{
|
|
250
|
+
height: 16,
|
|
251
|
+
width: 16
|
|
252
|
+
}}
|
|
253
|
+
onClick={() => setDeleteImageDialogVisible(true)}
|
|
254
|
+
/>
|
|
255
|
+
</div>
|
|
260
256
|
</div>
|
|
261
257
|
</div>
|
|
262
258
|
{
|
|
263
|
-
uploadCompleted
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
<circle cx="2" cy="2" r="2" fill="#C1C1C1" />
|
|
268
|
-
</svg>
|
|
269
|
-
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20" fill="none">
|
|
270
|
-
<mask id="mask0_2480_8635" style={{ maskType: 'alpha' }} maskUnits="userSpaceOnUse" x="0" y="0" width="20" height="20">
|
|
271
|
-
<rect width="20" height="20" fill="#D9D9D9" />
|
|
272
|
-
</mask>
|
|
273
|
-
<g mask="url(#mask0_2480_8635)">
|
|
274
|
-
<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" />
|
|
275
|
-
</g>
|
|
276
|
-
</svg>
|
|
277
|
-
Completed
|
|
278
|
-
</div>
|
|
279
|
-
:
|
|
280
|
-
<div className="flex align-items-center gap-2 text-sm">
|
|
281
|
-
{uploadedSize} of {totalSize}
|
|
282
|
-
<svg xmlns="http://www.w3.org/2000/svg" width="4" height="4" viewBox="0 0 4 4" fill="none">
|
|
283
|
-
<circle cx="2" cy="2" r="2" fill="#C1C1C1" />
|
|
284
|
-
</svg>
|
|
285
|
-
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" fill="none">
|
|
286
|
-
<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" />
|
|
287
|
-
</svg>
|
|
288
|
-
Uploading ${uploadProgress}% Completed
|
|
289
|
-
</div>
|
|
259
|
+
uploadCompleted &&
|
|
260
|
+
<div className="flex align-items-center gap-2 text-sm">
|
|
261
|
+
{totalSize}
|
|
262
|
+
</div>
|
|
290
263
|
}
|
|
291
264
|
</div>
|
|
292
265
|
</div>
|
|
293
|
-
<ProgressBar value={uploadProgress} showValue={false} style={{ height: 4 }} className="mt-2" />
|
|
294
266
|
</div>
|
|
295
267
|
)}
|
|
296
268
|
</div>
|
|
@@ -306,7 +278,21 @@ export class SolidMediaSingleField implements ISolidField {
|
|
|
306
278
|
)}
|
|
307
279
|
onHide={() => setDeleteImageDialogVisible(false)}
|
|
308
280
|
>
|
|
309
|
-
<p>Are you sure you want to delete
|
|
281
|
+
<p>Are you sure you want to delete media?</p>
|
|
282
|
+
</Dialog>
|
|
283
|
+
<Dialog
|
|
284
|
+
visible={isReplaceImageDialogVisible}
|
|
285
|
+
header="Replace Image"
|
|
286
|
+
modal
|
|
287
|
+
footer={() => (
|
|
288
|
+
<div className="flex justify-content-center">
|
|
289
|
+
<Button label="Yes, Replace" icon="pi pi-check" className='small-button' severity="danger" onClick={handleReplaceFile} />
|
|
290
|
+
<Button label="Cancel" icon="pi pi-times" className='small-button' onClick={() => setReplaceImageDialogVisible(false)} />
|
|
291
|
+
</div>
|
|
292
|
+
)}
|
|
293
|
+
onHide={() => setReplaceImageDialogVisible(false)}
|
|
294
|
+
>
|
|
295
|
+
<p>An media is already uploaded. Do you want to delete it and upload a new one?</p>
|
|
310
296
|
</Dialog>
|
|
311
297
|
</div>
|
|
312
298
|
);
|
|
@@ -321,8 +321,8 @@ const CreateModel = ({ data, params }: any) => {
|
|
|
321
321
|
size="small"
|
|
322
322
|
className="bg-primary-reverse p-0"
|
|
323
323
|
style={{
|
|
324
|
-
height:
|
|
325
|
-
width:
|
|
324
|
+
height: 33.06,
|
|
325
|
+
width: 33.06
|
|
326
326
|
}}
|
|
327
327
|
onClick={(e) =>
|
|
328
328
|
// @ts-ignore
|
|
@@ -400,9 +400,9 @@ const CreateModel = ({ data, params }: any) => {
|
|
|
400
400
|
</>
|
|
401
401
|
}
|
|
402
402
|
</div>
|
|
403
|
-
<div className="solid-form-stepper">
|
|
403
|
+
{/* <div className="solid-form-stepper">
|
|
404
404
|
<SolidFormStepper />
|
|
405
|
-
</div>
|
|
405
|
+
</div> */}
|
|
406
406
|
<div className="p-4 solid-form-content">
|
|
407
407
|
<TabView
|
|
408
408
|
activeIndex={activeIndex}
|
|
@@ -340,8 +340,8 @@ const CreateModule = ({ data }: any) => {
|
|
|
340
340
|
size="small"
|
|
341
341
|
className="bg-primary-reverse p-0"
|
|
342
342
|
style={{
|
|
343
|
-
height:
|
|
344
|
-
width:
|
|
343
|
+
height: 33.06,
|
|
344
|
+
width: 33.06
|
|
345
345
|
}}
|
|
346
346
|
onClick={(e) =>
|
|
347
347
|
// @ts-ignore
|
|
@@ -414,9 +414,9 @@ const CreateModule = ({ data }: any) => {
|
|
|
414
414
|
</>
|
|
415
415
|
}
|
|
416
416
|
</div>
|
|
417
|
-
<div className="solid-form-stepper">
|
|
417
|
+
{/* <div className="solid-form-stepper">
|
|
418
418
|
<SolidFormStepper />
|
|
419
|
-
</div>
|
|
419
|
+
</div> */}
|
|
420
420
|
<div className="p-4 solid-form-content">
|
|
421
421
|
<p className="form-wrapper-heading text-base">Basic Info</p>
|
|
422
422
|
<div className="formgrid grid">
|
|
@@ -264,9 +264,9 @@ const CreateUser = ({ data, params }: any) => {
|
|
|
264
264
|
</>
|
|
265
265
|
)}
|
|
266
266
|
</div>
|
|
267
|
-
<div className="solid-form-stepper">
|
|
267
|
+
{/* <div className="solid-form-stepper">
|
|
268
268
|
<SolidFormStepper />
|
|
269
|
-
</div>
|
|
269
|
+
</div> */}
|
|
270
270
|
<div className="p-4 solid-form-content">
|
|
271
271
|
<div className="grid">
|
|
272
272
|
<div className="col-8 mx-auto">
|
|
@@ -42,7 +42,7 @@ const AppConfig = (props: AppConfigProps) => {
|
|
|
42
42
|
|
|
43
43
|
const applyScale = () => {
|
|
44
44
|
// document.documentElement.style.fontSize = layoutConfig.scale + 'px';
|
|
45
|
-
document.documentElement.style.fontSize =
|
|
45
|
+
document.documentElement.style.fontSize = 15 + 'px';
|
|
46
46
|
};
|
|
47
47
|
|
|
48
48
|
useEffect(() => {
|
|
@@ -18,7 +18,7 @@ const NavbarTwoMenu = ({ menuItems }: any) => {
|
|
|
18
18
|
// currentItem === activeParentPath ?' p-highlight' : ''
|
|
19
19
|
return (
|
|
20
20
|
<div key={item?.key} className={`flex align-items-center cursor-pointer menuHead px-3 ${isSettingsPage ? ' p-highlight' : ''}`} onClick={options.onClick}>
|
|
21
|
-
<Link href={item?.url ? item?.url : '#'} className="w-full flex justify-content-between font-
|
|
21
|
+
<Link href={item?.url ? item?.url : '#'} className="w-full flex justify-content-between font-normal">
|
|
22
22
|
<div className="flex align-items-center gap-3">
|
|
23
23
|
<span className={item.icon} />
|
|
24
24
|
<span className="">
|
|
@@ -86,15 +86,14 @@ const UserProfileMenu = () => {
|
|
|
86
86
|
<Button
|
|
87
87
|
text
|
|
88
88
|
severity="secondary"
|
|
89
|
-
className="flex align-items-center gap-2"
|
|
90
|
-
icon={
|
|
91
|
-
<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 18 18" fill="none">
|
|
92
|
-
<path d="M3.75 15.75C3.3375 15.75 2.98438 15.6031 2.69063 15.3094C2.39687 15.0156 2.25 14.6625 2.25 14.25V3.75C2.25 3.3375 2.39687 2.98438 2.69063 2.69063C2.98438 2.39687 3.3375 2.25 3.75 2.25H9V3.75H3.75V14.25H9V15.75H3.75ZM12 12.75L10.9688 11.6625L12.8813 9.75H6.75V8.25H12.8813L10.9688 6.3375L12 5.25L15.75 9L12 12.75Z" fill="#F04A4A" />
|
|
93
|
-
</svg>
|
|
94
|
-
}
|
|
89
|
+
className="flex align-items-center gap-2 w-full px-3"
|
|
95
90
|
onClick={() => setConfirmLogout(true)}
|
|
96
|
-
|
|
97
|
-
|
|
91
|
+
>
|
|
92
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 18 18" fill="none">
|
|
93
|
+
<path d="M3.75 15.75C3.3375 15.75 2.98438 15.6031 2.69063 15.3094C2.39687 15.0156 2.25 14.6625 2.25 14.25V3.75C2.25 3.3375 2.39687 2.98438 2.69063 2.69063C2.98438 2.39687 3.3375 2.25 3.75 2.25H9V3.75H3.75V14.25H9V15.75H3.75ZM12 12.75L10.9688 11.6625L12.8813 9.75H6.75V8.25H12.8813L10.9688 6.3375L12 5.25L15.75 9L12 12.75Z" fill="#F04A4A" />
|
|
94
|
+
</svg>
|
|
95
|
+
<span className="p-button-label flex-none ">Logout</span>
|
|
96
|
+
</Button>
|
|
98
97
|
</div>
|
|
99
98
|
</OverlayPanel>
|
|
100
99
|
</div>
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export const downloadMediaFile = async (fileUrl: string, fileName: string) => {
|
|
2
|
+
try {
|
|
3
|
+
const response = await fetch(`${process.env.NEXT_PUBLIC_BACKEND_API_URL}/${fileUrl}`);
|
|
4
|
+
const blob = await response.blob();
|
|
5
|
+
|
|
6
|
+
const link = document.createElement("a");
|
|
7
|
+
link.href = URL.createObjectURL(blob);
|
|
8
|
+
link.setAttribute("download", fileName || "download");
|
|
9
|
+
|
|
10
|
+
document.body.appendChild(link);
|
|
11
|
+
link.click();
|
|
12
|
+
document.body.removeChild(link);
|
|
13
|
+
|
|
14
|
+
// Clean up the object URL
|
|
15
|
+
URL.revokeObjectURL(link.href);
|
|
16
|
+
} catch (error) {
|
|
17
|
+
console.error("Download failed:", error);
|
|
18
|
+
}
|
|
19
|
+
};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export default function getAcceptedFileTypes(mediaTypes: string[]) {
|
|
2
|
+
if (!mediaTypes || mediaTypes.length === 0) return {}; // Default empty
|
|
3
|
+
|
|
4
|
+
const fileTypeMapping: Record<string, string> = {
|
|
5
|
+
image: "image/*",
|
|
6
|
+
audio: "audio/*",
|
|
7
|
+
video: "video/*",
|
|
8
|
+
pdf: "application/pdf",
|
|
9
|
+
file: "",
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
// If "file" exists in mediaTypes, allow all files
|
|
13
|
+
if (mediaTypes.includes("file")) {
|
|
14
|
+
return {};
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
const acceptedTypes = mediaTypes
|
|
18
|
+
.map(type => fileTypeMapping[type.toLowerCase()])
|
|
19
|
+
.filter(Boolean); // Remove undefined values
|
|
20
|
+
|
|
21
|
+
return acceptedTypes.length > 0 ? Object.fromEntries(acceptedTypes.map(type => [type, []])) : {};
|
|
22
|
+
}
|
|
@@ -175,8 +175,9 @@ const authProviders: NextAuthOptions = {
|
|
|
175
175
|
callbacks: {
|
|
176
176
|
// @ts-ignore
|
|
177
177
|
jwt: async ({ token, user }) => {
|
|
178
|
-
|
|
179
|
-
|
|
178
|
+
const bufferTime = 60000;
|
|
179
|
+
if (Date.now() >= (token.accessTokenExpires as number - bufferTime)) {
|
|
180
|
+
return await refreshAccessToken(token); // Call the refresh token function
|
|
180
181
|
}
|
|
181
182
|
|
|
182
183
|
// If there is no user (first time login or session), we return the user data
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"FilterComponent.d.ts","sourceRoot":"","sources":["../../../src/components/common/FilterComponent.tsx"],"names":[],"mappings":"AAuRA,QAAA,MAAM,eAAe,+CAkJpB,CAAC;AAEF,eAAe,eAAe,CAAC"}
|