@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.
Files changed (204) hide show
  1. package/dist/components/Svg/FileSvg.d.ts +4 -0
  2. package/dist/components/Svg/FileSvg.d.ts.map +1 -0
  3. package/dist/components/Svg/FileSvg.js +15 -0
  4. package/dist/components/Svg/FileSvg.js.map +1 -0
  5. package/dist/components/auth/AuthLayout.d.ts.map +1 -1
  6. package/dist/components/auth/AuthLayout.js +6 -6
  7. package/dist/components/auth/AuthLayout.js.map +1 -1
  8. package/dist/components/auth/SolidForgotPassword.js +1 -1
  9. package/dist/components/auth/SolidForgotPassword.js.map +1 -1
  10. package/dist/components/auth/SolidInitialLoginOtp.js +1 -1
  11. package/dist/components/auth/SolidInitialLoginOtp.js.map +1 -1
  12. package/dist/components/auth/SolidInitiateRegisterOtp.js +1 -1
  13. package/dist/components/auth/SolidInitiateRegisterOtp.js.map +1 -1
  14. package/dist/components/auth/SolidResetPassword.js +1 -1
  15. package/dist/components/auth/SolidResetPassword.js.map +1 -1
  16. package/dist/components/common/DropzonePlaceholder.d.ts +6 -1
  17. package/dist/components/common/DropzonePlaceholder.d.ts.map +1 -1
  18. package/dist/components/common/DropzonePlaceholder.js +8 -2
  19. package/dist/components/common/DropzonePlaceholder.js.map +1 -1
  20. package/dist/components/common/FileReaderExt.d.ts.map +1 -1
  21. package/dist/components/common/FileReaderExt.js +2 -1
  22. package/dist/components/common/FileReaderExt.js.map +1 -1
  23. package/dist/components/core/common/SolidConfigureLayoutElement.d.ts.map +1 -1
  24. package/dist/components/core/common/SolidConfigureLayoutElement.js +28 -6
  25. package/dist/components/core/common/SolidConfigureLayoutElement.js.map +1 -1
  26. package/dist/components/core/common/SolidGlobalSearchElement.d.ts.map +1 -1
  27. package/dist/components/core/common/SolidGlobalSearchElement.js +3 -3
  28. package/dist/components/core/common/SolidGlobalSearchElement.js.map +1 -1
  29. package/dist/components/core/form/SolidFormView.js +3 -5
  30. package/dist/components/core/form/SolidFormView.js.map +1 -1
  31. package/dist/components/core/form/fields/SolidMediaMultipleField.d.ts.map +1 -1
  32. package/dist/components/core/form/fields/SolidMediaMultipleField.js +66 -64
  33. package/dist/components/core/form/fields/SolidMediaMultipleField.js.map +1 -1
  34. package/dist/components/core/form/fields/SolidMediaSingleField.d.ts.map +1 -1
  35. package/dist/components/core/form/fields/SolidMediaSingleField.js +72 -91
  36. package/dist/components/core/form/fields/SolidMediaSingleField.js.map +1 -1
  37. package/dist/components/core/model/CreateModel.js +3 -4
  38. package/dist/components/core/model/CreateModel.js.map +1 -1
  39. package/dist/components/core/module/CreateModule.js +3 -4
  40. package/dist/components/core/module/CreateModule.js.map +1 -1
  41. package/dist/components/core/users/CreateUser.js +1 -2
  42. package/dist/components/core/users/CreateUser.js.map +1 -1
  43. package/dist/components/layout/AppConfig.js +1 -1
  44. package/dist/components/layout/navbar-two-menu.js +1 -1
  45. package/dist/components/layout/user-profile-menu.d.ts.map +1 -1
  46. package/dist/components/layout/user-profile-menu.js +1 -1
  47. package/dist/components/layout/user-profile-menu.js.map +1 -1
  48. package/dist/helpers/downloadMediaFile.d.ts +2 -0
  49. package/dist/helpers/downloadMediaFile.d.ts.map +1 -0
  50. package/dist/helpers/downloadMediaFile.js +66 -0
  51. package/dist/helpers/downloadMediaFile.js.map +1 -0
  52. package/dist/helpers/getAcceptedFileTypes.d.ts +4 -0
  53. package/dist/helpers/getAcceptedFileTypes.d.ts.map +1 -0
  54. package/dist/helpers/getAcceptedFileTypes.js +20 -0
  55. package/dist/helpers/getAcceptedFileTypes.js.map +1 -0
  56. package/dist/index.js +2 -2
  57. package/dist/nextAuth/authProviders.d.ts.map +1 -1
  58. package/dist/nextAuth/authProviders.js +15 -10
  59. package/dist/nextAuth/authProviders.js.map +1 -1
  60. package/dist/stylesheets/globals.css +2476 -0
  61. package/dist/stylesheets/styles/SF-Pro-Display-Regular.otf +0 -0
  62. package/dist/stylesheets/styles/layout/_config.scss +54 -0
  63. package/dist/stylesheets/styles/layout/_content.scss +77 -0
  64. package/dist/stylesheets/styles/layout/_footer.scss +8 -0
  65. package/dist/stylesheets/styles/layout/_main.scss +47 -0
  66. package/dist/stylesheets/styles/layout/_menu.scss +185 -0
  67. package/dist/stylesheets/styles/layout/_mixins.scss +13 -0
  68. package/dist/stylesheets/styles/layout/_responsive.scss +99 -0
  69. package/dist/stylesheets/styles/layout/_topbar.scss +149 -0
  70. package/dist/stylesheets/styles/layout/_typography.scss +63 -0
  71. package/dist/stylesheets/styles/layout/_utils.scss +27 -0
  72. package/dist/stylesheets/styles/layout/_variables.scss +3 -0
  73. package/dist/stylesheets/styles/layout/layout.scss +11 -0
  74. package/dist/stylesheets/themes/solid-dark-purple/fonts/SF-Pro-Display-Black.otf +0 -0
  75. package/dist/stylesheets/themes/solid-dark-purple/fonts/SF-Pro-Display-Bold.otf +0 -0
  76. package/dist/stylesheets/themes/solid-dark-purple/fonts/SF-Pro-Display-Heavy.otf +0 -0
  77. package/dist/stylesheets/themes/solid-dark-purple/fonts/SF-Pro-Display-Light.otf +0 -0
  78. package/dist/stylesheets/themes/solid-dark-purple/fonts/SF-Pro-Display-Medium.otf +0 -0
  79. package/dist/stylesheets/themes/solid-dark-purple/fonts/SF-Pro-Display-Regular.otf +0 -0
  80. package/dist/stylesheets/themes/solid-dark-purple/fonts/SF-Pro-Display-Semibold.otf +0 -0
  81. package/dist/stylesheets/themes/solid-dark-purple/fonts/SF-Pro-Display-Thin.otf +0 -0
  82. package/dist/stylesheets/themes/solid-dark-purple/fonts/SF-Pro-Display-Ultralight.otf +0 -0
  83. package/dist/stylesheets/themes/solid-dark-purple/theme.css +9051 -0
  84. package/dist/stylesheets/themes/solid-light-purple/fonts/SF-Pro-Display-Black.otf +0 -0
  85. package/dist/stylesheets/themes/solid-light-purple/fonts/SF-Pro-Display-Bold.otf +0 -0
  86. package/dist/stylesheets/themes/solid-light-purple/fonts/SF-Pro-Display-Heavy.otf +0 -0
  87. package/dist/stylesheets/themes/solid-light-purple/fonts/SF-Pro-Display-Light.otf +0 -0
  88. package/dist/stylesheets/themes/solid-light-purple/fonts/SF-Pro-Display-Medium.otf +0 -0
  89. package/dist/stylesheets/themes/solid-light-purple/fonts/SF-Pro-Display-Regular.otf +0 -0
  90. package/dist/stylesheets/themes/solid-light-purple/fonts/SF-Pro-Display-Semibold.otf +0 -0
  91. package/dist/stylesheets/themes/solid-light-purple/fonts/SF-Pro-Display-Thin.otf +0 -0
  92. package/dist/stylesheets/themes/solid-light-purple/fonts/SF-Pro-Display-Ultralight.otf +0 -0
  93. package/dist/stylesheets/themes/solid-light-purple/theme.css +9077 -0
  94. package/package.json +1 -1
  95. package/src/components/Svg/FileSvg.tsx +18 -0
  96. package/src/components/auth/AuthLayout.tsx +7 -5
  97. package/src/components/auth/SolidForgotPassword.tsx +1 -1
  98. package/src/components/auth/SolidInitialLoginOtp.tsx +1 -1
  99. package/src/components/auth/SolidInitiateRegisterOtp.tsx +1 -1
  100. package/src/components/auth/SolidResetPassword.tsx +1 -1
  101. package/src/components/common/DropzonePlaceholder.tsx +22 -9
  102. package/src/components/common/FileReaderExt.tsx +5 -3
  103. package/src/components/core/common/SolidConfigureLayoutElement.tsx +72 -31
  104. package/src/components/core/common/SolidGlobalSearchElement.tsx +4 -3
  105. package/src/components/core/form/SolidFormView.tsx +4 -4
  106. package/src/components/core/form/fields/SolidMediaMultipleField.tsx +116 -95
  107. package/src/components/core/form/fields/SolidMediaSingleField.tsx +109 -123
  108. package/src/components/core/model/CreateModel.tsx +4 -4
  109. package/src/components/core/module/CreateModule.tsx +4 -4
  110. package/src/components/core/users/CreateUser.tsx +2 -2
  111. package/src/components/layout/AppConfig.tsx +1 -1
  112. package/src/components/layout/navbar-two-menu.tsx +1 -1
  113. package/src/components/layout/user-profile-menu.tsx +7 -8
  114. package/src/helpers/downloadMediaFile.tsx +19 -0
  115. package/src/helpers/getAcceptedFileTypes.tsx +22 -0
  116. package/src/nextAuth/authProviders.tsx +3 -2
  117. package/dist/components/common/FilterComponent.d.ts +0 -3
  118. package/dist/components/common/FilterComponent.d.ts.map +0 -1
  119. package/dist/components/common/FilterComponent.js +0 -214
  120. package/dist/components/common/FilterComponent.js.map +0 -1
  121. package/dist/components/core/filter/columns/SolidBigintField.d.ts +0 -4
  122. package/dist/components/core/filter/columns/SolidBigintField.d.ts.map +0 -1
  123. package/dist/components/core/filter/columns/SolidBigintField.js +0 -8
  124. package/dist/components/core/filter/columns/SolidBigintField.js.map +0 -1
  125. package/dist/components/core/filter/columns/SolidBooleanField.d.ts +0 -4
  126. package/dist/components/core/filter/columns/SolidBooleanField.d.ts.map +0 -1
  127. package/dist/components/core/filter/columns/SolidBooleanField.js +0 -27
  128. package/dist/components/core/filter/columns/SolidBooleanField.js.map +0 -1
  129. package/dist/components/core/filter/columns/SolidComputedField.d.ts +0 -4
  130. package/dist/components/core/filter/columns/SolidComputedField.d.ts.map +0 -1
  131. package/dist/components/core/filter/columns/SolidComputedField.js +0 -22
  132. package/dist/components/core/filter/columns/SolidComputedField.js.map +0 -1
  133. package/dist/components/core/filter/columns/SolidDateField.d.ts +0 -9
  134. package/dist/components/core/filter/columns/SolidDateField.d.ts.map +0 -1
  135. package/dist/components/core/filter/columns/SolidDateField.js +0 -35
  136. package/dist/components/core/filter/columns/SolidDateField.js.map +0 -1
  137. package/dist/components/core/filter/columns/SolidDatetimeField.d.ts +0 -4
  138. package/dist/components/core/filter/columns/SolidDatetimeField.d.ts.map +0 -1
  139. package/dist/components/core/filter/columns/SolidDatetimeField.js +0 -24
  140. package/dist/components/core/filter/columns/SolidDatetimeField.js.map +0 -1
  141. package/dist/components/core/filter/columns/SolidDecimalField.d.ts +0 -4
  142. package/dist/components/core/filter/columns/SolidDecimalField.d.ts.map +0 -1
  143. package/dist/components/core/filter/columns/SolidDecimalField.js +0 -8
  144. package/dist/components/core/filter/columns/SolidDecimalField.js.map +0 -1
  145. package/dist/components/core/filter/columns/SolidExternalIdField.d.ts +0 -4
  146. package/dist/components/core/filter/columns/SolidExternalIdField.d.ts.map +0 -1
  147. package/dist/components/core/filter/columns/SolidExternalIdField.js +0 -25
  148. package/dist/components/core/filter/columns/SolidExternalIdField.js.map +0 -1
  149. package/dist/components/core/filter/columns/SolidFloatField.d.ts +0 -4
  150. package/dist/components/core/filter/columns/SolidFloatField.d.ts.map +0 -1
  151. package/dist/components/core/filter/columns/SolidFloatField.js +0 -8
  152. package/dist/components/core/filter/columns/SolidFloatField.js.map +0 -1
  153. package/dist/components/core/filter/columns/SolidIdField.d.ts +0 -4
  154. package/dist/components/core/filter/columns/SolidIdField.d.ts.map +0 -1
  155. package/dist/components/core/filter/columns/SolidIdField.js +0 -25
  156. package/dist/components/core/filter/columns/SolidIdField.js.map +0 -1
  157. package/dist/components/core/filter/columns/SolidIntField.d.ts +0 -4
  158. package/dist/components/core/filter/columns/SolidIntField.d.ts.map +0 -1
  159. package/dist/components/core/filter/columns/SolidIntField.js +0 -34
  160. package/dist/components/core/filter/columns/SolidIntField.js.map +0 -1
  161. package/dist/components/core/filter/columns/SolidLongTextField.d.ts +0 -4
  162. package/dist/components/core/filter/columns/SolidLongTextField.d.ts.map +0 -1
  163. package/dist/components/core/filter/columns/SolidLongTextField.js +0 -8
  164. package/dist/components/core/filter/columns/SolidLongTextField.js.map +0 -1
  165. package/dist/components/core/filter/columns/SolidMediaMultipleField.d.ts +0 -4
  166. package/dist/components/core/filter/columns/SolidMediaMultipleField.d.ts.map +0 -1
  167. package/dist/components/core/filter/columns/SolidMediaMultipleField.js +0 -35
  168. package/dist/components/core/filter/columns/SolidMediaMultipleField.js.map +0 -1
  169. package/dist/components/core/filter/columns/SolidMediaSingleField.d.ts +0 -4
  170. package/dist/components/core/filter/columns/SolidMediaSingleField.d.ts.map +0 -1
  171. package/dist/components/core/filter/columns/SolidMediaSingleField.js +0 -35
  172. package/dist/components/core/filter/columns/SolidMediaSingleField.js.map +0 -1
  173. package/dist/components/core/filter/columns/SolidRelationField.d.ts +0 -4
  174. package/dist/components/core/filter/columns/SolidRelationField.d.ts.map +0 -1
  175. package/dist/components/core/filter/columns/SolidRelationField.js +0 -12
  176. package/dist/components/core/filter/columns/SolidRelationField.js.map +0 -1
  177. package/dist/components/core/filter/columns/SolidRichTextField.d.ts +0 -4
  178. package/dist/components/core/filter/columns/SolidRichTextField.d.ts.map +0 -1
  179. package/dist/components/core/filter/columns/SolidRichTextField.js +0 -8
  180. package/dist/components/core/filter/columns/SolidRichTextField.js.map +0 -1
  181. package/dist/components/core/filter/columns/SolidSelectionDynamicField.d.ts +0 -4
  182. package/dist/components/core/filter/columns/SolidSelectionDynamicField.d.ts.map +0 -1
  183. package/dist/components/core/filter/columns/SolidSelectionDynamicField.js +0 -25
  184. package/dist/components/core/filter/columns/SolidSelectionDynamicField.js.map +0 -1
  185. package/dist/components/core/filter/columns/SolidSelectionStaticField.d.ts +0 -4
  186. package/dist/components/core/filter/columns/SolidSelectionStaticField.d.ts.map +0 -1
  187. package/dist/components/core/filter/columns/SolidSelectionStaticField.js +0 -26
  188. package/dist/components/core/filter/columns/SolidSelectionStaticField.js.map +0 -1
  189. package/dist/components/core/filter/columns/SolidShortTextField.d.ts +0 -4
  190. package/dist/components/core/filter/columns/SolidShortTextField.d.ts.map +0 -1
  191. package/dist/components/core/filter/columns/SolidShortTextField.js +0 -33
  192. package/dist/components/core/filter/columns/SolidShortTextField.js.map +0 -1
  193. package/dist/components/core/filter/columns/SolidTimeField.d.ts +0 -4
  194. package/dist/components/core/filter/columns/SolidTimeField.d.ts.map +0 -1
  195. package/dist/components/core/filter/columns/SolidTimeField.js +0 -24
  196. package/dist/components/core/filter/columns/SolidTimeField.js.map +0 -1
  197. package/dist/components/core/filter/columns/SolidUuidField.d.ts +0 -4
  198. package/dist/components/core/filter/columns/SolidUuidField.d.ts.map +0 -1
  199. package/dist/components/core/filter/columns/SolidUuidField.js +0 -25
  200. package/dist/components/core/filter/columns/SolidUuidField.js.map +0 -1
  201. package/dist/components/core/filter/columns/relations/SolidRelationManyToOneField.d.ts +0 -4
  202. package/dist/components/core/filter/columns/relations/SolidRelationManyToOneField.d.ts.map +0 -1
  203. package/dist/components/core/filter/columns/relations/SolidRelationManyToOneField.js +0 -54
  204. 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: File[]) => {
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
- setUploadedSize("0 KB");
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
- // useEffect(() => {
171
- // const fieldValue = formik?.values[fieldLayoutInfo.attrs.name];
149
+ setUploadCompleted(false);
150
+ setFileDetails(null);
151
+ formik.setFieldValue(fieldLayoutInfo.attrs.name, null);
172
152
 
173
- // if (fieldValue instanceof File) {
174
- // setImagesPreview(URL.createObjectURL(fieldValue)); // Generate preview URL for file
175
- // }
176
- // if (typeof fieldValue === 'object') {
177
- // setImagesPreview(fieldValue); // Generate preview URL for file
178
- // }
179
- // if (!fieldValue) {
180
- // setImagesPreview(null);
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
- const fileUrl = fieldValue._full_url;
188
- if (typeof fileUrl === "string" && fileUrl.length > 0) {
189
- const fileName = fileUrl.split("/").pop(); // Extract filename from URL
190
- setFileDetails({ name: fileName || "Unknown File", type: "Uploaded File" });
191
-
192
- // Set upload progress
193
- setUploadProgress(100);
194
- setUploadCompleted(true);
195
- setImageToBeDeletedData(fieldValue.id)
196
- // Ensure Formik has the existing file URL
197
- formik.setFieldValue(fieldLayoutInfo.attrs.name, fieldValue);
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
- "image/jpeg": [],
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-center justify-content-between">
255
- <div className="font-bold">{fileDetails.name}</div>
256
- <div className="cancel-upload-button" onClick={() => setDeleteImageDialogVisible(true)}>
257
- <svg xmlns="http://www.w3.org/2000/svg" width="6" height="6" viewBox="0 0 6 6" fill="none">
258
- <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" />
259
- </svg>
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
- <div className="flex align-items-center gap-2 text-sm">
265
- {totalSize} of {totalSize}
266
- <svg xmlns="http://www.w3.org/2000/svg" width="4" height="4" viewBox="0 0 4 4" fill="none">
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 image?</p>
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: 32,
325
- width: 32
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: 32,
344
- width: 32
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 = 14 + 'px';
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-medium">
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
- label="Logout"
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
- if (Date.now() >= (token.accessTokenExpires as number)) {
179
- return refreshAccessToken(token); // Call the refresh token function
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,3 +0,0 @@
1
- declare const FilterComponent: () => import("react/jsx-runtime").JSX.Element;
2
- export default FilterComponent;
3
- //# sourceMappingURL=FilterComponent.d.ts.map
@@ -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"}