@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 +1 -1
- package/src/components/DataGrid.jsx +2 -2
- package/src/components/Notification.jsx +8 -44
- package/src/components/generic/GenericDetail.jsx +71 -24
- package/src/components/generic/GenericIndex.jsx +15 -8
- package/src/components/generic/NotificationList.jsx +8 -24
- package/src/components/styles/DataGrid.module.scss +3 -2
- package/src/components/styles/Form.module.scss +9 -2
- package/src/components/styles/GenericDetail.module.scss +24 -0
- package/src/components/styles/GenericIndex.module.scss +24 -0
- package/src/components/styles/Notification.module.scss +114 -88
- package/src/components/styles/NotificationList.module.scss +2 -30
- package/src/components/styles/SweetAlert.module.css +21 -2
- package/src/components/styles/global.css +0 -5
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.
|
|
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' : '
|
|
3722
|
+
width: windowWidth < 768 ? '95vw' : '90vw',
|
|
3723
3723
|
minWidth: windowWidth < 768 ? '95vw' : '600px',
|
|
3724
|
-
maxWidth: '
|
|
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
|
-
<
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
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
|
|
1758
|
-
|
|
1759
|
-
|
|
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(
|
|
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(
|
|
1910
|
+
url: replaceDropzoneUrlParams(
|
|
1911
|
+
activeTabConfig.url
|
|
1912
|
+
),
|
|
1893
1913
|
method: 'PUT',
|
|
1894
|
-
type:
|
|
1914
|
+
type:
|
|
1915
|
+
activeTabConfig.filetype ===
|
|
1916
|
+
'image'
|
|
1917
|
+
? 'gallery'
|
|
1918
|
+
: 'list',
|
|
1895
1919
|
data: {
|
|
1896
|
-
file_relationship:
|
|
1920
|
+
file_relationship:
|
|
1921
|
+
activeTabConfig.file_relationship,
|
|
1897
1922
|
},
|
|
1898
|
-
folder:
|
|
1923
|
+
folder:
|
|
1924
|
+
activeTabConfig.folder ||
|
|
1925
|
+
'uploads',
|
|
1899
1926
|
filetype: activeTabConfig.filetype,
|
|
1900
|
-
deleteUrl:
|
|
1927
|
+
deleteUrl:
|
|
1928
|
+
replaceDropzoneUrlParams(
|
|
1929
|
+
activeTabConfig.deleteUrl
|
|
1930
|
+
) || '/ajax/files/delete',
|
|
1901
1931
|
showDescription: true,
|
|
1902
1932
|
}}
|
|
1903
|
-
url={replaceDropzoneUrlParams(
|
|
1933
|
+
url={replaceDropzoneUrlParams(
|
|
1934
|
+
activeTabConfig.url
|
|
1935
|
+
)}
|
|
1904
1936
|
urlKey={activeTabConfig.urlKey}
|
|
1905
|
-
deleteUrl={
|
|
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 ===
|
|
2627
|
-
|
|
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 !==
|
|
2671
|
+
{item.type !==
|
|
2672
|
+
'ocrTemplate' && (
|
|
2633
2673
|
<strong>
|
|
2634
2674
|
{item.label
|
|
2635
2675
|
? `${item.label}:`
|
|
2636
2676
|
: null}
|
|
2637
2677
|
</strong>
|
|
2638
|
-
)}
|
|
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: '
|
|
3796
|
-
|
|
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={
|
|
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=
|
|
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
|
|
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 = () =>
|
|
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 =
|
|
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: '
|
|
1011
|
-
|
|
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={
|
|
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=
|
|
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
|
|
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
|
-
|
|
51
|
+
id: ['data'],
|
|
52
|
+
nameFrom: 'label',
|
|
55
53
|
label: 'Message',
|
|
56
|
-
type: '
|
|
57
|
-
|
|
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:
|
|
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:
|
|
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
|
};
|
|
@@ -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:
|
|
242
|
-
max-height:
|
|
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:
|
|
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(
|
|
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.
|
|
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:
|
|
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:
|
|
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:
|
|
228
|
-
border:
|
|
229
|
-
color: #
|
|
230
|
-
cursor: pointer;
|
|
231
|
-
padding:
|
|
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:
|
|
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
|
-
|
|
257
|
+
background: #e9ecef !important;
|
|
258
|
+
color: #495057 !important;
|
|
259
|
+
border-color: #adb5bd !important;
|
|
244
260
|
}
|
|
245
261
|
|
|
246
262
|
.notiDismiss:hover {
|
|
247
|
-
background-color:
|
|
248
|
-
color:
|
|
249
|
-
|
|
250
|
-
|
|
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:
|
|
307
|
-
color:
|
|
308
|
-
padding:
|
|
309
|
-
border-radius:
|
|
310
|
-
border: none;
|
|
311
|
-
display: flex;
|
|
312
|
-
align-items: center;
|
|
313
|
-
justify-content: center;
|
|
314
|
-
gap:
|
|
315
|
-
font-size:
|
|
316
|
-
font-weight: 500;
|
|
317
|
-
cursor: pointer;
|
|
318
|
-
box-shadow: 0
|
|
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:
|
|
327
|
-
box-shadow: 0
|
|
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
|
|
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.
|
|
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:
|
|
356
|
-
color:
|
|
357
|
-
font-size: 14px;
|
|
358
|
-
font-weight: 500;
|
|
359
|
-
cursor: pointer;
|
|
360
|
-
padding:
|
|
361
|
-
border-radius:
|
|
362
|
-
border: none;
|
|
363
|
-
width:
|
|
364
|
-
|
|
365
|
-
text-align: center;
|
|
366
|
-
transition: all 0.2s ease;
|
|
367
|
-
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
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:
|
|
376
|
-
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.
|
|
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
|
|
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
|
-
|
|
4
|
-
|
|
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
|
|
68
|
+
/* Make the modal use full width like GenericIndex */
|
|
69
69
|
:global(.swal2-popup.swal2-modal) {
|
|
70
|
-
max-width:
|
|
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;
|