diff --git a/src/assets/scss/components/notificationsSidebar.scss b/src/assets/scss/components/notificationsSidebar.scss
new file mode 100644
index 0000000..2bc2eb8
--- /dev/null
+++ b/src/assets/scss/components/notificationsSidebar.scss
@@ -0,0 +1,55 @@
+.notificationsIcon {
+ &:hover {
+ cursor: pointer;
+ }
+}
+
+.notificationsSidebar {
+ max-width: 360px;
+ width: 100%;
+}
+
+.notificationsSidebar__loading {
+ padding: 30px 0;
+ display: flex;
+ justify-content: center;
+ flex-direction: column;
+ align-items: center;
+ gap: 10px;
+}
+
+.notificationsSidebar__list {
+ display: flex;
+ flex-direction: column;
+ gap: 5px;
+ list-style: none;
+ padding: 0;
+}
+
+.notificationsSidebar__listItem {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ gap: 5px;
+ padding: 15px 0;
+ border-bottom: 1px solid #e7e7e7;
+
+ &:hover {
+ cursor: pointer;
+ color: var(--primary-text);
+ }
+}
+
+.notificationsSidebar__listItemContent {
+ display: flex;
+ flex-direction: column;
+ gap: 5px;
+ font-size: 14px;
+}
+
+.notificationsSidebar__listItemChosen {
+ display: flex;
+ flex-direction: column;
+ align-items: flex-start;
+ gap: 5px;
+}
diff --git a/src/assets/scss/theme.scss b/src/assets/scss/theme.scss
index 4ad1ef5..2b48f72 100644
--- a/src/assets/scss/theme.scss
+++ b/src/assets/scss/theme.scss
@@ -44,4 +44,5 @@
@import "./components/error404.scss";
@import "./components/myTable.scss";
@import "./components/evaluation.scss";
-@import "./components/fieldsRepeater.scss";
\ No newline at end of file
+@import "./components/fieldsRepeater.scss";
+@import "./components/notificationsSidebar.scss";
diff --git a/src/components/NotificationsSidebar/components/NotificationItem/index.js b/src/components/NotificationsSidebar/components/NotificationItem/index.js
new file mode 100644
index 0000000..df13bc0
--- /dev/null
+++ b/src/components/NotificationsSidebar/components/NotificationItem/index.js
@@ -0,0 +1,19 @@
+import React from 'react';
+
+const NotificationItem = ({ item, clickFn }) => {
+ const handleClick = () => {
+ clickFn(item.id);
+ }
+
+ return (
+
+
+ {item.title}
+ {item.createdDate}
+
+
+
+ )
+}
+
+export default NotificationItem;
diff --git a/src/components/NotificationsSidebar/components/NotificationItemChosen/index.js b/src/components/NotificationsSidebar/components/NotificationItemChosen/index.js
new file mode 100644
index 0000000..4821df3
--- /dev/null
+++ b/src/components/NotificationsSidebar/components/NotificationItemChosen/index.js
@@ -0,0 +1,22 @@
+import React from 'react';
+import { __ } from '@wordpress/i18n';
+import { Button } from 'primereact/button';
+
+const NotificationItemChosen = ({ item, closeFn }) => {
+ return (
+
+
+ {item.title}
+ {item.createdDate}
+ {item.message}
+
+ )
+}
+
+export default NotificationItemChosen;
diff --git a/src/components/NotificationsSidebar/index.js b/src/components/NotificationsSidebar/index.js
new file mode 100644
index 0000000..55b08f5
--- /dev/null
+++ b/src/components/NotificationsSidebar/index.js
@@ -0,0 +1,121 @@
+import React, { useEffect, useState } from 'react';
+import { __ } from '@wordpress/i18n';
+import { head, isEmpty } from 'ramda';
+
+// components
+import { Badge } from 'primereact/badge';
+import { Sidebar } from 'primereact/sidebar';
+import { TabPanel, TabView } from 'primereact/tabview';
+import NotificationItem from './components/NotificationItem';
+import NotificationItemChosen from './components/NotificationItemChosen';
+
+const NotificationsSidebar = () => {
+ const [activeIndex, setActiveIndex] = useState(0);
+ const [loading, setLoading] = useState(false);
+ const [notificationsVisible, setNotificationsVisible] = useState(false);
+ const [notifications, setNotifications] = useState([]);
+ const [notificationsRead, setNotificationsRead] = useState([]);
+ const [chosenMsg, setChosenMsg] = useState({});
+
+ // Handle tab change
+ const handleTabChange = (e) => {
+ setActiveIndex(e.index);
+ fetchTabData(e.index);
+ };
+
+ const fetchTabData = (index) => {
+ setChosenMsg({});
+ console.log('fetchTabData', index);
+ setLoading(true);
+ setTimeout(() => {
+ setLoading(false);
+ }, 7000)
+ }
+
+ const chooseNotification = (id) => {
+ const properItems = activeIndex === 0 ? notifications : notificationsRead;
+ const chosen = head(properItems.filter(o => o.id === id));
+ if (chosen) {
+ setChosenMsg(chosen);
+ }
+ }
+
+ const closeChosenMsg = () => {
+ setChosenMsg({});
+ }
+
+ useEffect(() => {
+ setNotifications(() => {
+ const msg = {
+ 'id': 35,
+ 'createdDate': '2024-12-23T14:55:27.278103',
+ 'updatedDate': '2024-12-23T14:55:27.278103',
+ 'userId': 30,
+ 'title': 'Il Risultato della Valutazione per la Richiesta È Disponibile',
+ 'message': 'Il risultato della valutazione per la richiesta ai sensi del protocollo n. 10000015 è ora disponibile.',
+ 'status': 'UNREAD',
+ 'companyId': 103,
+ 'redirectUrl': 'EVALUATION_RESULT',
+ 'notificationType': 'EVALUATION_RESULT'
+ };
+ return Array.from({ length: 33 }, (_, index) => ({
+ ...msg,
+ id: msg.id + index
+ }));
+ })
+ }, []);
+
+ return (
+ <>
+ setNotificationsVisible(true)}>
+
+
+ setNotificationsVisible(false)}>
+
+
+ {loading
+ ?
+
+
+ : !isEmpty(chosenMsg)
+ ?
+ : (notifications.length > 0
+ ?
+ {notifications.map(o => )}
+
+ :
+
+ {__('Vuoto', 'gepafin')}
+
)}
+
+
+ {loading
+ ?
+
+
+ : !isEmpty(chosenMsg)
+ ?
+ : (notificationsRead.length > 0
+ ?
+ {notificationsRead.map(o => )}
+
+ :
+
+
+ {__('Vuoto', 'gepafin')}
+
)}
+
+
+
+ >
+ )
+}
+
+export default NotificationsSidebar;
diff --git a/src/layouts/DefaultLayout/components/AppTopbar/index.js b/src/layouts/DefaultLayout/components/AppTopbar/index.js
index 27c3a6b..8bb75b4 100644
--- a/src/layouts/DefaultLayout/components/AppTopbar/index.js
+++ b/src/layouts/DefaultLayout/components/AppTopbar/index.js
@@ -1,4 +1,4 @@
-import React, { useRef, useState } from 'react';
+import React, { useRef } from 'react';
import { __ } from '@wordpress/i18n';
// components
@@ -8,14 +8,12 @@ import LogoIcon from '../../../../icons/LogoIcon';
import { IconField } from 'primereact/iconfield';
import { InputIcon } from 'primereact/inputicon';
import { InputText } from 'primereact/inputtext';
-import { Badge } from 'primereact/badge';
import { Button } from 'primereact/button';
import TopBarProfileMenu from '../../../../components/TopBarProfileMenu';
-import { Sidebar } from 'primereact/sidebar';
+import NotificationsSidebar from '../../../../components/NotificationsSidebar';
const AppTopbar = () => {
const menuLeft = useRef(null);
- const [notificationsVisible, setNotificationsVisible] = useState(false);
const startContent =
@@ -26,14 +24,13 @@ const AppTopbar = () => {
-
-
-
+
{/*
*/}