@visns-studio/visns-components 5.14.6 → 5.14.8

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/package.json CHANGED
@@ -88,7 +88,7 @@
88
88
  "react-dom": "^17.0.0 || ^18.0.0"
89
89
  },
90
90
  "name": "@visns-studio/visns-components",
91
- "version": "5.14.6",
91
+ "version": "5.14.8",
92
92
  "description": "Various packages to assist in the development of our Custom Applications.",
93
93
  "main": "src/index.js",
94
94
  "files": [
@@ -3719,9 +3719,9 @@ const DataGrid = forwardRef(
3719
3719
  onClose={modalClose}
3720
3720
  closeOnDocumentClick={false}
3721
3721
  contentStyle={{
3722
- width: windowWidth < 768 ? '95vw' : '80vw',
3722
+ width: windowWidth < 768 ? '95vw' : '90vw',
3723
3723
  minWidth: windowWidth < 768 ? '95vw' : '600px',
3724
- maxWidth: '1200px',
3724
+ maxWidth: '1400px',
3725
3725
  ...(formData.verticalAlign === 'top' && {
3726
3726
  position: 'fixed',
3727
3727
  top: '5vh',
@@ -325,50 +325,14 @@ function Notification(props) {
325
325
  </div>
326
326
 
327
327
  <div className={styles.notiboxActions}>
328
- <div className={styles.buttonWrapper}>
329
- <button
330
- className={styles.viewAllBtn}
331
- onClick={showAllNotifications}
332
- aria-label="View all notifications"
333
- type="button"
334
- style={{
335
- backgroundColor: 'var(--primary-color)',
336
- color: 'var(--tertiary-color, white)',
337
- padding: '10px 20px',
338
- borderRadius: 'var(--br, 6px)',
339
- border: 'none',
340
- width: 'auto',
341
- minWidth: '200px',
342
- textAlign: 'center',
343
- fontWeight: '500',
344
- fontSize: '14px',
345
- boxShadow:
346
- '0 2px 4px rgba(0, 0, 0, 0.1)',
347
- cursor: 'pointer',
348
- transition: 'all 0.2s ease',
349
- }}
350
- onMouseOver={(e) =>
351
- (e.target.style.backgroundColor =
352
- 'var(--secondary-color)')
353
- }
354
- onMouseOut={(e) =>
355
- (e.target.style.backgroundColor =
356
- 'var(--primary-color)')
357
- }
358
- onFocus={(e) => {
359
- e.target.style.backgroundColor =
360
- 'var(--primary-color)';
361
- e.target.style.boxShadow =
362
- '0 0 0 3px rgba(var(--primary-color-rgb, 0, 86, 179), 0.4)';
363
- }}
364
- onBlur={(e) => {
365
- e.target.style.boxShadow =
366
- '0 2px 4px rgba(0, 0, 0, 0.1)';
367
- }}
368
- >
369
- View all notifications
370
- </button>
371
- </div>
328
+ <button
329
+ className={styles.viewAllBtn}
330
+ onClick={showAllNotifications}
331
+ aria-label="View all notifications"
332
+ type="button"
333
+ >
334
+ View all notifications
335
+ </button>
372
336
  </div>
373
337
  </div>
374
338
  </div>
@@ -242,7 +242,7 @@ function GenericDetail({
242
242
 
243
243
  /** Fileupload states */
244
244
  const [files, setFiles] = useState([]);
245
-
245
+
246
246
  // Debug logging for files state changes
247
247
  useEffect(() => {
248
248
  console.log('GenericDetail: Files state changed:', {
@@ -250,7 +250,7 @@ function GenericDetail({
250
250
  filesCount: files ? files.length : 0,
251
251
  filesType: typeof files,
252
252
  isArray: Array.isArray(files),
253
- firstFile: files && files.length > 0 ? files[0] : null
253
+ firstFile: files && files.length > 0 ? files[0] : null,
254
254
  });
255
255
  }, [files]);
256
256
  const [loadingProgress, setLoadingProgress] = useState(0);
@@ -275,6 +275,16 @@ function GenericDetail({
275
275
  const [lightboxOpen, setLightboxOpen] = useState(false);
276
276
  const [lightboxIndex, setLightboxIndex] = useState(0);
277
277
 
278
+ /** Window Width State for Responsive Modal */
279
+ const [windowWidth, setWindowWidth] = useState(window.innerWidth);
280
+
281
+ // Handle window resize for responsive modal
282
+ useEffect(() => {
283
+ const handleResize = () => setWindowWidth(window.innerWidth);
284
+ window.addEventListener('resize', handleResize);
285
+ return () => window.removeEventListener('resize', handleResize);
286
+ }, []);
287
+
278
288
  // Gallery modal close function
279
289
  const modalGalleryClose = () => {
280
290
  setModalGalleryShow(false);
@@ -1437,7 +1447,7 @@ function GenericDetail({
1437
1447
  return renderLink();
1438
1448
  case 'ocrTemplate':
1439
1449
  return (
1440
- <OcrTemplateEnhanced
1450
+ <OcrTemplateEnhanced
1441
1451
  id={id}
1442
1452
  data={data}
1443
1453
  setData={setData}
@@ -1754,14 +1764,20 @@ function GenericDetail({
1754
1764
  // Helper function to get nested object value using dot notation
1755
1765
  const getNestedValue = (obj, path) => {
1756
1766
  if (!obj || !path) return null;
1757
- return path.split('.').reduce((current, key) => {
1758
- return current && current[key] !== undefined ? current[key] : null;
1759
- }, obj);
1767
+ return path
1768
+ .split('.')
1769
+ .reduce((current, key) => {
1770
+ return current &&
1771
+ current[key] !== undefined
1772
+ ? current[key]
1773
+ : null;
1774
+ }, obj);
1760
1775
  };
1761
1776
 
1762
1777
  // Extract files using nested key support
1763
- const files = activeTabConfig.key
1764
- ? getNestedValue(data, activeTabConfig.key) || []
1778
+ const files = activeTabConfig.key
1779
+ ? getNestedValue(data, activeTabConfig.key) ||
1780
+ []
1765
1781
  : [];
1766
1782
 
1767
1783
  const downloadFile = (file) => {
@@ -1874,7 +1890,9 @@ function GenericDetail({
1874
1890
 
1875
1891
  // Create a fetchData function that refetches the main data
1876
1892
  const handleFetchData = () => {
1877
- console.log('GenericDetail: DropZone fetchData called, refetching main data...');
1893
+ console.log(
1894
+ 'GenericDetail: DropZone fetchData called, refetching main data...'
1895
+ );
1878
1896
  setDataReload(!dataReload);
1879
1897
  };
1880
1898
 
@@ -1889,20 +1907,38 @@ function GenericDetail({
1889
1907
  fetchData={handleFetchData}
1890
1908
  files={files}
1891
1909
  settings={{
1892
- url: replaceDropzoneUrlParams(activeTabConfig.url),
1910
+ url: replaceDropzoneUrlParams(
1911
+ activeTabConfig.url
1912
+ ),
1893
1913
  method: 'PUT',
1894
- type: activeTabConfig.filetype === 'image' ? 'gallery' : 'list',
1914
+ type:
1915
+ activeTabConfig.filetype ===
1916
+ 'image'
1917
+ ? 'gallery'
1918
+ : 'list',
1895
1919
  data: {
1896
- file_relationship: activeTabConfig.file_relationship,
1920
+ file_relationship:
1921
+ activeTabConfig.file_relationship,
1897
1922
  },
1898
- folder: activeTabConfig.folder || 'uploads',
1923
+ folder:
1924
+ activeTabConfig.folder ||
1925
+ 'uploads',
1899
1926
  filetype: activeTabConfig.filetype,
1900
- deleteUrl: replaceDropzoneUrlParams(activeTabConfig.deleteUrl) || '/ajax/files/delete',
1927
+ deleteUrl:
1928
+ replaceDropzoneUrlParams(
1929
+ activeTabConfig.deleteUrl
1930
+ ) || '/ajax/files/delete',
1901
1931
  showDescription: true,
1902
1932
  }}
1903
- url={replaceDropzoneUrlParams(activeTabConfig.url)}
1933
+ url={replaceDropzoneUrlParams(
1934
+ activeTabConfig.url
1935
+ )}
1904
1936
  urlKey={activeTabConfig.urlKey}
1905
- deleteUrl={replaceDropzoneUrlParams(activeTabConfig.deleteUrl) || '/ajax/files/delete'}
1937
+ deleteUrl={
1938
+ replaceDropzoneUrlParams(
1939
+ activeTabConfig.deleteUrl
1940
+ ) || '/ajax/files/delete'
1941
+ }
1906
1942
  entityData={data}
1907
1943
  routeParams={routeParams}
1908
1944
  dataKey={activeTabConfig.key}
@@ -2623,19 +2659,27 @@ function GenericDetail({
2623
2659
  className={
2624
2660
  item.size ===
2625
2661
  'full'
2626
- ? item.type === 'ocrTemplate'
2627
- ? styles['fw-grid-item']
2662
+ ? item.type ===
2663
+ 'ocrTemplate'
2664
+ ? styles[
2665
+ 'fw-grid-item'
2666
+ ]
2628
2667
  : `${styles['fw-grid-item']} ${styles.notecolor}`
2629
2668
  : null
2630
2669
  }
2631
2670
  >
2632
- {item.type !== 'ocrTemplate' && (
2671
+ {item.type !==
2672
+ 'ocrTemplate' && (
2633
2673
  <strong>
2634
2674
  {item.label
2635
2675
  ? `${item.label}:`
2636
2676
  : null}
2637
2677
  </strong>
2638
- )}{item.type !== 'ocrTemplate' ? ' ' : ''}
2678
+ )}
2679
+ {item.type !==
2680
+ 'ocrTemplate'
2681
+ ? ' '
2682
+ : ''}
2639
2683
  {item
2640
2684
  .href
2641
2685
  ?.url &&
@@ -3792,8 +3836,9 @@ function GenericDetail({
3792
3836
  onClose={modalClose}
3793
3837
  closeOnDocumentClick={false}
3794
3838
  contentStyle={{
3795
- width: '80vw',
3796
- maxWidth: '1200px',
3839
+ width: windowWidth < 768 ? '95vw' : '90vw',
3840
+ minWidth: windowWidth < 768 ? '95vw' : '600px',
3841
+ maxWidth: '1400px',
3797
3842
  ...(formData.verticalAlign === 'top' && {
3798
3843
  position: 'fixed',
3799
3844
  top: '5vh',
@@ -3804,13 +3849,15 @@ function GenericDetail({
3804
3849
  }}
3805
3850
  >
3806
3851
  <div
3807
- className={`modalwrap top--modal modalWide ${
3852
+ className={`${styles.modalwrap} ${
3853
+ styles['top--modal']
3854
+ } ${styles.modalWide} ${
3808
3855
  formData.verticalAlign === 'top'
3809
3856
  ? 'modal-top-aligned'
3810
3857
  : ''
3811
3858
  }`}
3812
3859
  >
3813
- <div className="modal">
3860
+ <div className={styles.modal}>
3814
3861
  <Form
3815
3862
  closeModal={modalClose}
3816
3863
  columnId={formId}
@@ -19,16 +19,20 @@ import GenericReportForm from './GenericReportForm';
19
19
 
20
20
  import styles from '../styles/GenericIndex.module.scss';
21
21
 
22
- function useWindowHeight() {
22
+ function useWindowDimensions() {
23
23
  const [windowHeight, setWindowHeight] = useState(window.innerHeight);
24
+ const [windowWidth, setWindowWidth] = useState(window.innerWidth);
24
25
 
25
26
  useEffect(() => {
26
- const handleResize = () => setWindowHeight(window.innerHeight);
27
+ const handleResize = () => {
28
+ setWindowHeight(window.innerHeight);
29
+ setWindowWidth(window.innerWidth);
30
+ };
27
31
  window.addEventListener('resize', handleResize);
28
32
  return () => window.removeEventListener('resize', handleResize);
29
33
  }, []);
30
34
 
31
- return windowHeight;
35
+ return { windowHeight, windowWidth };
32
36
  }
33
37
 
34
38
  function useConfig(setting, tabs, filters, setRowsSelected, tableSetting) {
@@ -236,7 +240,7 @@ function GenericIndex({
236
240
  const [customActionModalShow, setCustomActionModalShow] = useState(false);
237
241
  const [customActionFormData, setCustomActionFormData] = useState({});
238
242
  const [customActionConfig, setCustomActionConfig] = useState(null);
239
- const windowHeight = useWindowHeight();
243
+ const { windowHeight, windowWidth } = useWindowDimensions();
240
244
  const { config, setConfig, subnav, setSubnav } = useConfig(
241
245
  setting,
242
246
  setting.tabs,
@@ -1007,8 +1011,9 @@ function GenericIndex({
1007
1011
  onClose={closeCustomActionModal}
1008
1012
  closeOnDocumentClick={false}
1009
1013
  contentStyle={{
1010
- width: '80vw',
1011
- maxWidth: '1200px',
1014
+ width: windowWidth < 768 ? '95vw' : '90vw',
1015
+ minWidth: windowWidth < 768 ? '95vw' : '600px',
1016
+ maxWidth: '1400px',
1012
1017
  ...(customActionFormData.verticalAlign === 'top' && {
1013
1018
  position: 'fixed',
1014
1019
  top: '5vh',
@@ -1019,13 +1024,15 @@ function GenericIndex({
1019
1024
  }}
1020
1025
  >
1021
1026
  <div
1022
- className={`modalwrap top--modal modalWide ${
1027
+ className={`${styles.modalwrap} ${
1028
+ styles['top--modal']
1029
+ } ${styles.modalWide} ${
1023
1030
  customActionFormData.verticalAlign === 'top'
1024
1031
  ? 'modal-top-aligned'
1025
1032
  : ''
1026
1033
  }`}
1027
1034
  >
1028
- <div className="modal">
1035
+ <div className={styles.modal}>
1029
1036
  <Form
1030
1037
  closeModal={closeCustomActionModal}
1031
1038
  formSettings={customActionFormData}
@@ -1,13 +1,11 @@
1
1
  import React, { useState, useCallback } from 'react';
2
- import { useNavigate } from 'react-router-dom';
3
2
  import Table from '../DataGrid';
4
- import { Bell, Check, ArrowLeft } from 'lucide-react';
3
+ import { Bell, Check } from 'lucide-react';
5
4
  import { toast } from 'react-toastify';
6
5
  import CustomFetch from '../Fetch';
7
6
  import styles from '../styles/NotificationList.module.scss';
8
7
 
9
8
  const NotificationList = () => {
10
- const navigate = useNavigate();
11
9
  const [loading, setLoading] = useState(false);
12
10
 
13
11
  const markAllAsRead = useCallback(() => {
@@ -50,25 +48,26 @@ const NotificationList = () => {
50
48
  },
51
49
  columns: [
52
50
  {
53
- id: 'data',
54
- jsonData: 'label',
51
+ id: ['data'],
52
+ nameFrom: 'label',
55
53
  label: 'Message',
56
- type: 'json',
57
- flex: 1,
54
+ type: 'relation',
55
+ minWidth: 300,
56
+ wordWrap: true,
58
57
  },
59
58
  {
60
59
  id: 'created_at',
61
60
  label: 'Created At',
62
61
  type: 'datetime',
63
62
  minWidth: 180,
64
- maxWidth: 180,
63
+ maxWidth: 200,
65
64
  },
66
65
  {
67
66
  id: 'read_at',
68
67
  label: 'Read At',
69
68
  type: 'datetime',
70
69
  minWidth: 180,
71
- maxWidth: 180,
70
+ maxWidth: 200,
72
71
  },
73
72
  ],
74
73
  settings: [],
@@ -111,21 +110,6 @@ const NotificationList = () => {
111
110
  </div>
112
111
  </div>
113
112
  </div>
114
- <div className={styles.grid}>
115
- <div className={styles.grid__row}>
116
- <div className={styles.grid__full}>
117
- <div className={styles.backButtonContainer}>
118
- <button
119
- className={styles.backButton}
120
- onClick={() => navigate('/')}
121
- >
122
- <ArrowLeft size={16} />
123
- <span>Back to Dashboard</span>
124
- </button>
125
- </div>
126
- </div>
127
- </div>
128
- </div>
129
113
  </div>
130
114
  );
131
115
  };
@@ -145,8 +145,9 @@
145
145
  }
146
146
 
147
147
  .modalWide {
148
- width: 80vw;
149
- max-width: 1200px;
148
+ width: 90vw;
149
+ max-width: 1400px;
150
+ min-width: 600px;
150
151
  }
151
152
 
152
153
  .modal {
@@ -11,6 +11,12 @@
11
11
  grid-template-columns: 1fr 1fr 1fr 1fr;
12
12
  gap: 1em;
13
13
  }
14
+
15
+ /* Enhanced styling for wider modals */
16
+ .modal & form {
17
+ gap: 1.5em;
18
+ max-width: none;
19
+ }
14
20
  }
15
21
 
16
22
  .formItem {
@@ -238,9 +244,10 @@ input[type='file'] {
238
244
  .modal__content {
239
245
  width: 100%;
240
246
  position: relative;
241
- padding: 0.75rem;
242
- max-height: 80vh;
247
+ padding: 1rem;
248
+ max-height: 85vh;
243
249
  overflow-y: auto;
250
+ min-height: 400px;
244
251
 
245
252
  .btn {
246
253
  background: var(--primary-color);
@@ -945,3 +945,27 @@
945
945
  }
946
946
  }
947
947
 
948
+ // Modal styles (consistent with DataGrid)
949
+ .modalwrap {
950
+ background: var(--tertiary-color);
951
+ border-radius: 8px;
952
+ overflow: hidden;
953
+ box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15);
954
+ }
955
+
956
+ .top--modal {
957
+ position: relative;
958
+ z-index: 1000;
959
+ }
960
+
961
+ .modalWide {
962
+ width: 90vw;
963
+ max-width: 1400px;
964
+ min-width: 600px;
965
+ }
966
+
967
+ .modal {
968
+ width: 100%;
969
+ position: relative;
970
+ }
971
+
@@ -1090,3 +1090,27 @@
1090
1090
  filter: brightness(1.1);
1091
1091
  }
1092
1092
  }
1093
+
1094
+ // Modal styles (consistent with DataGrid)
1095
+ .modalwrap {
1096
+ background: var(--tertiary-color);
1097
+ border-radius: 8px;
1098
+ overflow: hidden;
1099
+ box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15);
1100
+ }
1101
+
1102
+ .top--modal {
1103
+ position: relative;
1104
+ z-index: 1000;
1105
+ }
1106
+
1107
+ .modalWide {
1108
+ width: 90vw;
1109
+ max-width: 1400px;
1110
+ min-width: 600px;
1111
+ }
1112
+
1113
+ .modal {
1114
+ width: 100%;
1115
+ position: relative;
1116
+ }
@@ -10,23 +10,33 @@
10
10
  background: transparent;
11
11
  border: none;
12
12
  cursor: pointer;
13
- padding: 6px;
13
+ padding: 8px;
14
14
  display: flex;
15
15
  align-items: center;
16
16
  justify-content: center;
17
- color: var(--paragraph-color);
17
+ color: var(--paragraph-color, #333);
18
18
  border-radius: 50%;
19
19
  transition: all 0.2s ease;
20
20
  outline: none;
21
+ width: 40px;
22
+ height: 40px;
23
+ /* Ensure minimum contrast */
24
+ opacity: 1;
21
25
  }
22
26
 
23
27
  .notificationTrigger:hover {
24
- background-color: rgba(0, 0, 0, 0.05);
25
- color: var(--primary-color);
28
+ background-color: rgba(var(--primary-color-rgb, 0, 86, 179), 0.1);
29
+ color: var(--primary-color, #0056b3);
30
+ transform: scale(1.05);
26
31
  }
27
32
 
28
33
  .notificationTrigger:focus {
29
- box-shadow: 0 0 0 2px rgba(var(--primary-color-rgb), 0.2);
34
+ box-shadow: 0 0 0 2px rgba(var(--primary-color-rgb, 0, 86, 179), 0.3);
35
+ background-color: rgba(var(--primary-color-rgb, 0, 86, 179), 0.05);
36
+ }
37
+
38
+ .notificationTrigger:active {
39
+ transform: scale(0.95);
30
40
  }
31
41
 
32
42
  /* Badge for unread notifications */
@@ -74,20 +84,22 @@
74
84
 
75
85
  /* Notification Box Header */
76
86
  .notiboxHeader {
77
- display: flex;
78
- align-items: center;
79
- justify-content: space-between;
80
- padding: 12px 16px;
81
- border-bottom: 1px solid rgba(0, 0, 0, 0.06);
82
- gap: 10px;
87
+ display: flex !important;
88
+ align-items: center !important;
89
+ justify-content: space-between !important;
90
+ padding: 12px 16px !important;
91
+ border-bottom: 1px solid rgba(0, 0, 0, 0.06) !important;
92
+ gap: 12px !important;
93
+ min-height: 48px !important;
83
94
  }
84
95
 
85
96
  .notiboxHeader h3 {
86
- margin: 0;
87
- font-size: 16px;
88
- font-weight: 600;
89
- color: var(--heading-color, #333);
90
- flex-shrink: 0;
97
+ margin: 0 !important;
98
+ font-size: 16px !important;
99
+ font-weight: 600 !important;
100
+ color: #333 !important;
101
+ flex-shrink: 0 !important;
102
+ flex-grow: 1 !important;
91
103
  }
92
104
 
93
105
  /* Notification Scroll Wrap */
@@ -221,33 +233,41 @@
221
233
  }
222
234
 
223
235
  .notiDismiss {
224
- position: absolute;
225
- right: 12px;
226
- top: 10px;
227
- background: transparent;
228
- border: none;
229
- color: #666; /* Darker color to ensure visibility */
230
- cursor: pointer;
231
- padding: 0;
232
- display: flex;
233
- align-items: center;
234
- justify-content: center;
235
- width: 24px;
236
- height: 24px;
237
- border-radius: 50%;
238
- transition: all 0.2s;
239
- opacity: 0.6; /* Start with some opacity to ensure visibility */
236
+ position: absolute !important;
237
+ right: 12px !important;
238
+ top: 10px !important;
239
+ background: #f8f9fa !important;
240
+ border: 1px solid #dee2e6 !important;
241
+ color: #6c757d !important;
242
+ cursor: pointer !important;
243
+ padding: 4px !important;
244
+ display: flex !important;
245
+ align-items: center !important;
246
+ justify-content: center !important;
247
+ width: 24px !important;
248
+ height: 24px !important;
249
+ border-radius: 50% !important;
250
+ transition: all 0.2s !important;
251
+ opacity: 1 !important;
252
+ visibility: visible !important;
253
+ z-index: 10 !important;
240
254
  }
241
255
 
242
256
  .notiContent:hover .notiDismiss {
243
- opacity: 1;
257
+ background: #e9ecef !important;
258
+ color: #495057 !important;
259
+ border-color: #adb5bd !important;
244
260
  }
245
261
 
246
262
  .notiDismiss:hover {
247
- background-color: rgba(0, 0, 0, 0.05);
248
- color: var(
249
- --secondary-color
250
- ); /* Use secondary color on hover for better visibility */
263
+ background-color: #dc3545 !important;
264
+ color: #ffffff !important;
265
+ border-color: #dc3545 !important;
266
+ }
267
+
268
+ .notiDismiss:focus {
269
+ outline: none !important;
270
+ box-shadow: 0 0 0 2px rgba(220, 53, 69, 0.3) !important;
251
271
  }
252
272
 
253
273
  /* Empty State */
@@ -303,37 +323,45 @@
303
323
 
304
324
  /* Mark All as Read Button */
305
325
  .markAllBtn {
306
- background-color: var(--primary-color);
307
- color: var(--tertiary-color, white);
308
- padding: 8px 16px;
309
- border-radius: var(--br, 6px);
310
- border: none;
311
- display: flex;
312
- align-items: center;
313
- justify-content: center;
314
- gap: 6px;
315
- font-size: 14px;
316
- font-weight: 500;
317
- cursor: pointer;
318
- box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
319
- transition: all 0.2s ease;
320
- outline: none;
321
- white-space: nowrap;
322
- flex-shrink: 0;
326
+ background-color: #6c757d !important;
327
+ color: #ffffff !important;
328
+ padding: 6px 10px !important;
329
+ border-radius: 4px !important;
330
+ border: none !important;
331
+ display: inline-flex !important;
332
+ align-items: center !important;
333
+ justify-content: center !important;
334
+ gap: 4px !important;
335
+ font-size: 12px !important;
336
+ font-weight: 500 !important;
337
+ cursor: pointer !important;
338
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2) !important;
339
+ transition: all 0.2s ease !important;
340
+ outline: none !important;
341
+ white-space: nowrap !important;
342
+ flex-shrink: 0 !important;
343
+ min-width: 120px !important;
344
+ height: 32px !important;
345
+ line-height: 1.2 !important;
346
+ opacity: 1 !important;
347
+ visibility: visible !important;
348
+ position: relative !important;
349
+ z-index: 10 !important;
323
350
  }
324
351
 
325
352
  .markAllBtn:hover:not(:disabled) {
326
- background-color: var(--secondary-color);
327
- box-shadow: 0 4px 8px rgba(0, 0, 0, 0.15);
353
+ background-color: #5a6268 !important;
354
+ box-shadow: 0 2px 6px rgba(0, 0, 0, 0.25) !important;
328
355
  }
329
356
 
330
357
  .markAllBtn:focus:not(:disabled) {
331
- box-shadow: 0 0 0 3px rgba(var(--primary-color-rgb, 0, 86, 179), 0.4);
358
+ box-shadow: 0 0 0 2px rgba(108, 117, 125, 0.4) !important;
332
359
  }
333
360
 
334
361
  .markAllBtn:disabled {
335
- opacity: 0.7;
336
- cursor: not-allowed;
362
+ opacity: 0.6 !important;
363
+ cursor: not-allowed !important;
364
+ background-color: #adb5bd !important;
337
365
  }
338
366
 
339
367
  /* Footer Actions */
@@ -345,40 +373,38 @@
345
373
  background-color: rgba(0, 0, 0, 0.02);
346
374
  }
347
375
 
348
- .buttonWrapper {
349
- display: inline-block;
350
- position: relative;
351
- z-index: 5;
352
- }
353
-
354
376
  .viewAllBtn {
355
- background-color: var(--primary-color);
356
- color: var(--tertiary-color, white);
357
- font-size: 14px;
358
- font-weight: 500;
359
- cursor: pointer;
360
- padding: 10px 20px;
361
- border-radius: var(--br, 6px);
362
- border: none;
363
- width: auto;
364
- min-width: 200px;
365
- text-align: center;
366
- transition: all 0.2s ease;
367
- box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
368
- /* Ensure the button is always visible */
369
- outline: none;
370
- position: relative;
371
- z-index: 1;
377
+ background-color: #6c757d !important;
378
+ color: #ffffff !important;
379
+ font-size: 14px !important;
380
+ font-weight: 500 !important;
381
+ cursor: pointer !important;
382
+ padding: 12px 24px !important;
383
+ border-radius: 6px !important;
384
+ border: none !important;
385
+ width: 100% !important;
386
+ max-width: 280px !important;
387
+ text-align: center !important;
388
+ transition: all 0.2s ease !important;
389
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2) !important;
390
+ outline: none !important;
391
+ position: relative !important;
392
+ height: 44px !important;
393
+ opacity: 1 !important;
394
+ visibility: visible !important;
395
+ display: block !important;
396
+ line-height: 1.2 !important;
397
+ z-index: 10 !important;
372
398
  }
373
399
 
374
- .viewAllBtn:hover {
375
- background-color: var(--secondary-color);
376
- box-shadow: 0 4px 8px rgba(0, 0, 0, 0.15);
400
+ .viewAllBtn:hover:not(:disabled) {
401
+ background-color: #5a6268 !important;
402
+ box-shadow: 0 4px 8px rgba(0, 0, 0, 0.25) !important;
377
403
  }
378
404
 
379
- .viewAllBtn:focus {
380
- box-shadow: 0 0 0 3px rgba(var(--primary-color-rgb), 0.4);
381
- outline: none;
405
+ .viewAllBtn:focus:not(:disabled) {
406
+ box-shadow: 0 0 0 2px rgba(108, 117, 125, 0.4) !important;
407
+ outline: none !important;
382
408
  }
383
409
 
384
410
  /* Bell Animation */
@@ -1,7 +1,7 @@
1
1
  .notificationListContainer {
2
2
  width: 100%;
3
- max-width: 1200px;
4
- margin: 0 auto;
3
+ margin: 0;
4
+ padding: 0;
5
5
  }
6
6
 
7
7
  .grid {
@@ -88,31 +88,3 @@
88
88
  opacity: 0.6;
89
89
  cursor: not-allowed;
90
90
  }
91
-
92
- .backButtonContainer {
93
- display: flex;
94
- justify-content: center;
95
- padding: 16px 0;
96
- }
97
-
98
- .backButton {
99
- display: flex;
100
- align-items: center;
101
- gap: 8px;
102
- background-color: var(--primary-color);
103
- color: white;
104
- border: none;
105
- border-radius: 6px;
106
- padding: 12px 24px;
107
- font-size: 14px;
108
- font-weight: 500;
109
- cursor: pointer;
110
- transition: all 0.2s ease;
111
- box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
112
- min-width: 200px;
113
- }
114
-
115
- .backButton:hover {
116
- background-color: var(--primary-color-darker, #0056b3);
117
- box-shadow: 0 4px 8px rgba(0, 0, 0, 0.15);
118
- }
@@ -65,9 +65,28 @@
65
65
  box-shadow: 0 0 0 2px rgba(107, 114, 128, 0.3) !important;
66
66
  }
67
67
 
68
- /* Make the modal more compact */
68
+ /* Make the modal use full width like GenericIndex */
69
69
  :global(.swal2-popup.swal2-modal) {
70
- max-width: 90%;
70
+ max-width: 95%;
71
+ width: 95%;
72
+ min-width: 800px;
73
+ }
74
+
75
+ /* Responsive adjustments for smaller screens */
76
+ @media (max-width: 1024px) {
77
+ :global(.swal2-popup.swal2-modal) {
78
+ max-width: 90%;
79
+ width: 90%;
80
+ min-width: 600px;
81
+ }
82
+ }
83
+
84
+ @media (max-width: 768px) {
85
+ :global(.swal2-popup.swal2-modal) {
86
+ max-width: 95%;
87
+ width: 95%;
88
+ min-width: 320px;
89
+ }
71
90
  }
72
91
 
73
92
  /* Reduce spacing between elements */
@@ -225,11 +225,6 @@ input[type]:not([type='search']):not([type='url']):not([type='hidden']):not(
225
225
  backdrop-filter: blur(3px);
226
226
  }
227
227
 
228
- .modalWide {
229
- width: 80vw !important;
230
- max-width: 1200px !important;
231
- }
232
-
233
228
  /* Top-aligned modal styles */
234
229
  .modal-top-aligned {
235
230
  max-height: 90vh !important;