Index: .idea/RNG.iml
===================================================================
--- .idea/RNG.iml	(revision a2cf76ef39eb9ad9c31f4239648f3ae7a7d0c764)
+++ .idea/RNG.iml	(revision 12c76de49cc7c41bf9613e50b1726d57c07f9e00)
@@ -6,4 +6,5 @@
     <orderEntry type="inheritedJdk" />
     <orderEntry type="sourceFolder" forTests="false" />
+    <orderEntry type="library" name="font-awesome" level="application" />
   </component>
 </module>
Index: ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/dto/eventDTO/DisplayEventDTO.java
===================================================================
--- ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/dto/eventDTO/DisplayEventDTO.java	(revision a2cf76ef39eb9ad9c31f4239648f3ae7a7d0c764)
+++ ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/dto/eventDTO/DisplayEventDTO.java	(revision 12c76de49cc7c41bf9613e50b1726d57c07f9e00)
@@ -8,5 +8,5 @@
 import java.util.List;
 
-public record DisplayEventDTO(
+public record   DisplayEventDTO(
         Long id,
         String name,
Index: ReserveNGo-frontend/index.html
===================================================================
--- ReserveNGo-frontend/index.html	(revision a2cf76ef39eb9ad9c31f4239648f3ae7a7d0c764)
+++ ReserveNGo-frontend/index.html	(revision 12c76de49cc7c41bf9613e50b1726d57c07f9e00)
@@ -3,10 +3,17 @@
 <head>
   <meta charset="UTF-8">
-  <link rel="icon" href="/favicon.ico">
   <meta name="viewport" content="width=device-width, initial-scale=1.0">
   <title>RnG</title>
 
-  <!-- Font Awesome -->
+<!--   Font Awesome-->
   <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.0/css/all.min.css" integrity="sha512-..." crossorigin="anonymous" referrerpolicy="no-referrer" />
+
+<!--
+    <link href="https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,100..900;1,100..900&family=Rubik:ital,wght@0,300..900;1,300..900&family=Source+Code+Pro:ital,wght@0,200..900;1,200..900&display=swap" rel="stylesheet">
+-->
+
+<!--
+    <link href="https://fonts.googleapis.com/css2?family=Nunito:ital,wght@0,200..1000;1,200..1000&family=Roboto:ital,wght@0,100..900;1,100..900&family=Rubik:ital,wght@0,300..900;1,300..900&family=Source+Code+Pro:ital,wght@0,200..900;1,200..900&display=swap" rel="stylesheet">
+-->
 
   <!-- Bootstrap CSS -->
Index: ReserveNGo-frontend/src/components/Project/Event/event_in_event_listing.vue
===================================================================
--- ReserveNGo-frontend/src/components/Project/Event/event_in_event_listing.vue	(revision 12c76de49cc7c41bf9613e50b1726d57c07f9e00)
+++ ReserveNGo-frontend/src/components/Project/Event/event_in_event_listing.vue	(revision 12c76de49cc7c41bf9613e50b1726d57c07f9e00)
@@ -0,0 +1,117 @@
+<script>
+import { userStore } from '@/PiniaStores/UserStore.js'
+import { useUtility } from '@/repository/utility.ts'
+import { config } from '@/constants/Api_config.js'
+import pankake from '@/components/ectd/easy-american-pancake-recipe.jpg'
+
+export default {
+  props: {
+    event: { type: Object, required: true },
+  },
+
+  data() {
+    return {
+      userStore_: userStore(),
+      eventImage: null,
+      pankake: pankake,
+    }
+  },
+
+  beforeMount() {
+    if (this.event.image) {
+      useUtility
+        .fetchImageBase64(this.event.image)
+        .then((base64) => (this.eventImage = base64))
+        .catch((error) => console.log(error))
+    }
+  },
+
+  computed: {
+    event_image() {
+      if (!this.event.image) return this.pankake
+      const url = new URL(this.event.image, config.API_BASE_URL)
+      return url.toString()
+    },
+
+    formattedDate() {
+      if (!this.event.eventStart.date) return 'Date TBA'
+      const date = new Date(this.event.eventStart.date)
+      return date.toLocaleDateString('en-US', {
+        weekday: 'short',
+        year: 'numeric',
+        month: 'short',
+        day: 'numeric',
+      })
+    },
+
+    formattedTime() {
+      if (!this.event.eventStart.time) return ''
+      return this.event.eventStart.time
+    },
+  },
+
+  methods: {
+    handleClick() {
+      this.$emit('select', this.event.id)
+    },
+  },
+}
+</script>
+
+<template>
+  <div
+    id="container"
+    class="row align-items-center my-3 p-3 rounded shadow-sm"
+    @click="handleClick"
+  >
+    <!-- Event Image -->
+    <div class="col-auto pe-0">
+      <img
+        :src="event_image"
+        alt="Event"
+        class="rounded"
+        style="width: 60px; height: 60px; object-fit: cover"
+      />
+    </div>
+
+    <!-- Event Info -->
+    <div class="col info ps-3">
+      <h5 class="mb-1 fw-bold">{{ event.title || event.name }}</h5>
+      <p class="mb-1 text-muted">
+        <i class="fas fa-calendar-alt me-1"></i>{{ formattedDate }}
+        <span v-if="formattedTime" class="ms-2">
+          <i class="fas fa-clock me-1"></i>{{ formattedTime }}
+        </span>
+      </p>
+      <p class="mb-1 text-muted" v-if="event.location">
+        <i class="fas fa-map-marker-alt me-1"></i>{{ event.location }}
+      </p>
+      <p class="mb-0 text-muted" v-if="event.description">
+        {{ event.description.substring(0, 100) }}{{ event.description.length > 100 ? '...' : '' }}
+      </p>
+    </div>
+
+    <!-- Action Button -->
+    <div class="col-auto d-flex align-items-center">
+      <div class="action-buttons d-flex align-items-center">
+        <button class="btn btn-outline-dark">
+          <i class="fas fa-info-circle me-1"></i> View Details
+        </button>
+      </div>
+    </div>
+  </div>
+</template>
+
+<style scoped>
+#container {
+  border-left: 3px solid #5ea5bc;
+  background: #fff;
+  transition: all 0.2s ease;
+  cursor: pointer;
+}
+
+#container:hover {
+  box-shadow: 0 2px 12px rgba(0, 0, 0, 0.2);
+  background-color: #f9f9f9;
+}
+</style>
Index: ReserveNGo-frontend/src/components/Project/Event/event_listing_container.vue
===================================================================
--- ReserveNGo-frontend/src/components/Project/Event/event_listing_container.vue	(revision 12c76de49cc7c41bf9613e50b1726d57c07f9e00)
+++ ReserveNGo-frontend/src/components/Project/Event/event_listing_container.vue	(revision 12c76de49cc7c41bf9613e50b1726d57c07f9e00)
@@ -0,0 +1,49 @@
+<script>
+import EventInEventListing from '@/components/Project/Event/event_in_event_listing.vue'
+import { defineComponent } from 'vue'
+
+export default defineComponent({
+  components: { EventInEventListing },
+  props: {
+    events: Array,
+  },
+  data() {
+    return {
+      selectedEventId: null,
+    }
+  },
+
+  computed: {
+    flattenedEvents() {
+      // Flatten the events array if it's nested (from transformArray)
+      if (!this.events || this.events.length === 0) return []
+
+      // Check if events are nested arrays
+      if (Array.isArray(this.events[0])) {
+        return this.events.flat()
+      }
+
+      return this.events
+    },
+  },
+})
+</script>
+
+<template>
+  <div id="container" class="container">
+    <h5>Events</h5>
+    <div v-if="flattenedEvents.length === 0" class="text-center text-muted py-5">
+      <i class="fas fa-calendar-times fa-3x mb-3"></i>
+      <p>No events available at the moment.</p>
+    </div>
+    <div v-for="event in flattenedEvents" :key="event.id">
+      <EventInEventListing :event="event" @select="selectedEventId = event.id" />
+    </div>
+  </div>
+</template>
+
+<style scoped>
+#container {
+  margin: 30px auto;
+}
+</style>
Index: ReserveNGo-frontend/src/components/Project/Event/events_carousel.vue
===================================================================
--- ReserveNGo-frontend/src/components/Project/Event/events_carousel.vue	(revision a2cf76ef39eb9ad9c31f4239648f3ae7a7d0c764)
+++ ReserveNGo-frontend/src/components/Project/Event/events_carousel.vue	(revision 12c76de49cc7c41bf9613e50b1726d57c07f9e00)
@@ -5,5 +5,4 @@
 import pankake from '@/components/ectd/easy-american-pancake-recipe.jpg'
 import { transformArray } from '@/mixins/utilFunctions'
-
 
 export default {
@@ -43,5 +42,5 @@
     processEventsForLogos(events) {
       if (!events || events.length === 0) return
-      
+
       const flatEvents = events.flat()
       flatEvents.forEach((event) => {
@@ -51,16 +50,20 @@
         // 3. We haven't already fetched this locale
         // 4. Event doesn't already have a logo
-        if (event && event.localId && 
-            !this.processedEventIds.has(event.id) && 
-            !this.processedLocalIds.has(event.localId) &&
-            !event.logo) {
+        if (
+          event &&
+          event.localId &&
+          !this.processedEventIds.has(event.id) &&
+          !this.processedLocalIds.has(event.localId) &&
+          !event.logo
+        ) {
           this.processedEventIds.add(event.id)
           this.processedLocalIds.add(event.localId)
-          
-          useLocales.getSpecificLocale(event.localId)
+
+          useLocales
+            .getSpecificLocale(event.localId)
             .then((locale) => {
               if (locale && locale.logo) {
                 // Set logo for all events with this localId
-                flatEvents.forEach(e => {
+                flatEvents.forEach((e) => {
                   if (e.localId === event.localId) {
                     e.logo = locale.logo
@@ -114,5 +117,5 @@
       }
     })
-    
+
     // Call the method once on component mount to set the initial state.
     this.updateItemsPerSlide()
@@ -126,49 +129,64 @@
     window.removeEventListener('resize', this.updateItemsPerSlide)
   },
-
 }
 </script>
 
 <template>
-  <div v-if="chunkedEvents && chunkedEvents.length > 0" id="carouselMulti3" class="carousel slide events-carousel-wrapper" data-bs-ride="carousel">
-    <div class="carousel-inner">
-      <div
-        class="carousel-item"
-        v-for="(eventGroup, index) in chunkedEvents"
-        :key="index"
-        :class="{ active: index === 0 }"
-      >
-        <div class="d-flex justify-content-center gap-2 px-4">
-          <!-- The inner loop now iterates over the `eventGroup` (the chunk) -->
-          <div v-for="event in eventGroup" :key="event.id" class="event-card-container">
-            <div class="card event-card h-100">
-              <div class="d-flex flex-row">
-                <!-- Image on left -->
-                <div class="event-image-wrapper">
-                  <img
-                    :src="getImageLogo(event.logo) || pankake"
-                    class="event-image"
-                    alt="Event image"
-                  />
-                  <div class="event-type-badge">
-                    <span class="badge bg-primary">{{ event.eventType }}</span>
-                  </div>
-                </div>
-                <!-- Content on right -->
-                <div class="card-body d-flex flex-column p-2">
-                  <h6 class="card-title fw-bold mb-1">{{ event.name }}</h6>
-                  <div class="event-details">
-                    <div class="d-flex align-items-center text-muted mb-1">
-                      <i class="fas fa-calendar-alt me-1"></i>
-                      <span>{{ event.eventStart.date }}</span>
-                    </div>
-                    <div class="d-flex align-items-center text-muted">
-                      <i class="fas fa-clock me-1"></i>
-                      <span>{{ event.eventStart.time }}</span>
+  <div class="events-section">
+    <div class="events-header">
+      <h5 class="events-title">Popular Events</h5>
+
+    </div>
+
+    <div
+      v-if="chunkedEvents && chunkedEvents.length > 0"
+      id="carouselMulti3"
+      class="carousel slide events-carousel-wrapper"
+      data-bs-ride="carousel"
+    >
+      <div class="carousel-inner">
+        <div
+          class="carousel-item"
+          v-for="(eventGroup, index) in chunkedEvents"
+          :key="index"
+          :class="{ active: index === 0 }"
+        >
+          <div class="d-flex justify-content-center gap-2 px-4">
+            <div v-for="event in eventGroup" :key="event.id" class="event-card-container">
+              <div class="card event-card h-100">
+                <div class="d-flex flex-row">
+                  <div class="event-image-wrapper">
+                    <img
+                      :src="getImageLogo(event.logo) || pankake"
+                      class="event-image"
+                      alt="Event image"
+                    />
+                    <div class="event-type-badge">
+                      <span class="badge bg-primary">{{ event.eventType }}</span>
                     </div>
                   </div>
-                  <button class="btn btn-outline-dark btn-sm mt-1" style="font-size: 0.7rem; padding: 0.2rem 0.4rem;">
-                    <i class="fas fa-info-circle me-1"></i>Details
-                  </button>
+
+                  <div class="card-body d-flex flex-column p-2">
+                    <h6 class="card-title fw-bold mb-1">{{ event.name }}</h6>
+                    <div class="event-details">
+                      <div class="d-flex align-items-center text-muted mb-1">
+                        <i class="fas fa-calendar-alt me-1"></i>
+                        <span>{{ event.eventStart.date }}</span>
+                      </div>
+                      <div class="d-flex align-items-center text-muted">
+                        <i class="fas fa-clock me-1"></i>
+                        <span>{{ event.eventStart.time }}</span>
+                      </div>
+                    </div>
+
+                    <router-link :to="`/more_details/${event.localId}`">
+                      <button
+                        class="btn btn-outline-dark btn-sm mt-1"
+                        style="font-size: 0.7rem; padding: 0.2rem 0.4rem"
+                      >
+                        <i class="fas fa-info-circle me-1"></i>Details
+                      </button>
+                    </router-link>
+                  </div>
                 </div>
               </div>
@@ -177,27 +195,30 @@
         </div>
       </div>
+
+      <button
+        v-if="chunkedEvents.length > 1"
+        class="carousel-control-prev carousel-control-custom"
+        type="button"
+        data-bs-target="#carouselMulti3"
+        data-bs-slide="prev"
+      >
+        <span class="carousel-control-prev-icon"></span>
+      </button>
+
+      <button
+        v-if="chunkedEvents.length > 1"
+        class="carousel-control-next carousel-control-custom"
+        type="button"
+        data-bs-target="#carouselMulti3"
+        data-bs-slide="next"
+      >
+        <span class="carousel-control-next-icon"></span>
+      </button>
     </div>
-    <button
-      v-if="chunkedEvents.length > 1"
-      class="carousel-control-prev carousel-control-custom"
-      type="button"
-      data-bs-target="#carouselMulti3"
-      data-bs-slide="prev"
-    >
-      <span class="carousel-control-prev-icon"></span>
-    </button>
-    <button
-      v-if="chunkedEvents.length > 1"
-      class="carousel-control-next carousel-control-custom"
-      type="button"
-      data-bs-target="#carouselMulti3"
-      data-bs-slide="next"
-    >
-      <span class="carousel-control-next-icon"></span>
-    </button>
-  </div>
-  <div v-else class="empty-events-state">
-    <div class="text-center py-2">
-      <p class="text-muted small mb-0">No events available</p>
+
+    <div v-else class="empty-events-state">
+      <div class="text-center py-2">
+        <p class="text-muted small mb-0">No events available</p>
+      </div>
     </div>
   </div>
@@ -348,5 +369,5 @@
     width: 240px;
   }
-  
+
   .events-carousel-wrapper {
     padding: 0 2rem;
@@ -359,14 +380,14 @@
     height: 80px;
   }
-  
+
   .event-image-wrapper {
     width: 80px;
     height: 80px;
   }
-  
+
   .events-carousel-wrapper {
     padding: 0 1.5rem;
   }
-  
+
   .carousel-control-prev-icon,
   .carousel-control-next-icon {
@@ -375,4 +396,38 @@
     background-size: 100% 100%;
   }
+
+  .events-section {
+    margin-bottom: 0.5rem;
+  }
+}
+.events-header {
+  display: flex;
+  flex-direction: row;
+  align-items: center;
+  justify-content: center;
+  padding: 0 2.5rem;
+  margin-bottom: 0.5rem;
+}
+
+.events-title {
+  font-size: 0.9rem;
+  font-weight: 600;
+  color: #212529;
+  text-transform: uppercase;
+  letter-spacing: 0.4px;
+  margin: 0;
+}
+
+.view-all-link {
+  font-size: 0.75rem;
+  font-weight: 500;
+  color: #9ca3af; /* neutral grey */
+  text-decoration: none;
+  transition: color 0.2s ease;
+}
+
+.view-all-link:hover {
+  color: #6b7280; /* slightly darker grey */
+  text-decoration: none;
 }
 </style>
Index: ReserveNGo-frontend/src/components/Project/Restaurant/Locale_listing_container.vue
===================================================================
--- ReserveNGo-frontend/src/components/Project/Restaurant/Locale_listing_container.vue	(revision a2cf76ef39eb9ad9c31f4239648f3ae7a7d0c764)
+++ ReserveNGo-frontend/src/components/Project/Restaurant/Locale_listing_container.vue	(revision 12c76de49cc7c41bf9613e50b1726d57c07f9e00)
@@ -3,10 +3,9 @@
 import { defineComponent } from 'vue'
 import { userStore } from '@/PiniaStores/UserStore.js'
-import { useLocales } from '@/repository/Locale'
 import { useCustomer } from '@/repository/Customer.ts'
 
 export default defineComponent({
   components: { LocalInLocalListing },
-  props:{
+  props: {
     mode: String,
     locals: Array,
@@ -24,7 +23,7 @@
     displayedLocals() {
       return this.mode === 'favourites'
-        ? this.locals.filter(local => this.favourite_locals.includes(local.id))
+        ? this.locals.filter((local) => this.favourite_locals.includes(local.id))
         : this.locals
-    }
+    },
   },
 
@@ -36,21 +35,20 @@
         .then(() => {
           if (isFav) {
-            this.favourite_locals = this.favourite_locals.filter(fav => fav !== id)
+            this.favourite_locals = this.favourite_locals.filter((fav) => fav !== id)
           } else {
             this.favourite_locals.push(id)
           }
         })
-        .catch(err => console.log(err))
+        .catch((err) => console.log(err))
     },
   },
 
   mounted() {
-
     // Only fetch favourite locals if user is logged in and is a customer
     if (this.userStore && this.userStore.data && this.userStore.data.role === 'ROLE_CUSTOMER') {
       useCustomer
         .getFavouriteLocals()
-        .then(data => (this.favourite_locals = data.map(local => local.id)))
-        .catch(err => console.log(err))
+        .then((data) => (this.favourite_locals = data.map((local) => local.id)))
+        .catch((err) => console.log(err))
     }
   },
@@ -60,4 +58,5 @@
 <template>
   <div id="container" class="container">
+    <h5>Locals</h5>
     <div v-for="local in displayedLocals" :key="local.id">
       <LocalInLocalListing
Index: ReserveNGo-frontend/src/components/Project/Restaurant/home_.vue
===================================================================
--- ReserveNGo-frontend/src/components/Project/Restaurant/home_.vue	(revision a2cf76ef39eb9ad9c31f4239648f3ae7a7d0c764)
+++ ReserveNGo-frontend/src/components/Project/Restaurant/home_.vue	(revision 12c76de49cc7c41bf9613e50b1726d57c07f9e00)
@@ -1,4 +1,5 @@
 <script>
 import Locale_listing_container from '@/components/Project/Restaurant/Locale_listing_container.vue'
+import Event_listing_container from '@/components/Project/Event/event_listing_container.vue'
 import SearchFilterPanel from '@/components/Project/Restaurant/search_filter_panel.vue'
 import Events_carousel from '@/components/Project/Event/events_carousel.vue'
@@ -10,4 +11,5 @@
   components: {
     Locale_listing_container,
+    Event_listing_container,
     SearchFilterPanel,
     Events_carousel,
@@ -17,6 +19,8 @@
     return {
       allEvents: [],
+      allEventsRaw: [], // Store the raw events data
       showBackToTop: true,
       locals: [],
+      activeView: 'locals', // 'locals' or 'events'
     }
   },
@@ -49,13 +53,70 @@
         wrapper.scrollTo({
           top: 0,
-          behavior: 'smooth'
+          behavior: 'smooth',
         })
       }
     },
     sendSearchQuery(searchQuery, sortBy, directions, isOpen) {
-        useLocales.getLocals(searchQuery, sortBy, directions, isOpen)
-          .then(data => { this.locals = data.locals;})
-          .catch(err => console.log("The locals are not being caught.", err))
-    }
+      if (this.activeView === 'locals') {
+        useLocales
+          .getLocals(searchQuery, sortBy, directions, isOpen)
+          .then((data) => {
+            this.locals = data.locals
+          })
+          .catch((err) => console.log('The locals are not being caught.', err))
+      } else {
+        // Handle event filtering
+        this.filterEvents(searchQuery, sortBy, directions)
+      }
+    },
+    filterEvents(searchQuery, sortBy, directions) {
+      let filteredEvents = [...this.allEventsRaw]
+
+      // Search filter
+      if (searchQuery) {
+        const query = searchQuery.toLowerCase()
+        filteredEvents = filteredEvents.filter(
+          (event) =>
+            (event.title && event.title.toLowerCase().includes(query)) ||
+            (event.name && event.name.toLowerCase().includes(query)) ||
+            (event.description && event.description.toLowerCase().includes(query)) ||
+            (event.location && event.location.toLowerCase().includes(query)),
+        )
+      }
+
+      // Sort
+      if (sortBy) {
+        filteredEvents.sort((a, b) => {
+          let compareA, compareB
+
+          switch (sortBy) {
+            case 'name':
+              compareA = (a.title || a.name || '').toLowerCase()
+              compareB = (b.title || b.name || '').toLowerCase()
+              return directions === 'desc'
+                ? compareB.localeCompare(compareA)
+                : compareA.localeCompare(compareB)
+
+            case 'date':
+              compareA = new Date(a.date || 0)
+              compareB = new Date(b.date || 0)
+              return directions === 'desc' ? compareB - compareA : compareA - compareB
+
+            case 'newest':
+              compareA = new Date(a.createdAt || a.date || 0)
+              compareB = new Date(b.createdAt || b.date || 0)
+              return compareB - compareA
+
+            default:
+              return 0
+          }
+        })
+      }
+
+      this.allEvents = transformArray(filteredEvents, 3)
+    },
+    setActiveView(view) {
+      this.activeView = view
+    },
   },
 
@@ -63,15 +124,22 @@
     useEvents
       .listAll()
-      .then(data => {
+      .then((data) => {
+        this.allEventsRaw = data.events // Store raw data
         this.allEvents = transformArray(data.events, 3)
-        console.log("Currently Reading here", this.allEvents)
+        console.log('Currently Reading here', this.allEvents)
       })
-      .catch(error => console.log("Probably failed fetching events due to login", error))
+      .catch((error) => console.log('Probably failed fetching events due to login', error))
 
     useLocales
       .getLocals()
-      .then(data => { this.locals = data.locals; console.log("The data of the locals will probobly be needed later so this console log stays", data); })
-      .catch(err => console.log("The locals are not being caught.", err))
-  }
+      .then((data) => {
+        this.locals = data.locals
+        console.log(
+          'The data of the locals will probobly be needed later so this console log stays',
+          data,
+        )
+      })
+      .catch((err) => console.log('The locals are not being caught.', err))
+  },
 }
 </script>
@@ -83,5 +151,5 @@
         <div class="row justify-content-center">
           <!-- Sticky Search and Filter Bar -->
-          <SearchFilterPanel @search-query-sent="sendSearchQuery" />
+          <SearchFilterPanel :activeView="activeView" @search-query-sent="sendSearchQuery" />
 
           <!-- Events Section - Compact Secondary Feature -->
@@ -92,7 +160,30 @@
           </div>
 
-          <!-- Scrollable Local Listings -->
+          <!-- Navigation Toggle -->
+          <div class="col-md-8">
+            <div class="navigation-toggle">
+              <button
+                @click="setActiveView('locals')"
+                :class="['nav-btn', { active: activeView === 'locals' }]"
+              >
+                <i class="fas fa-utensils me-2"></i>Locals
+              </button>
+              <button
+                @click="setActiveView('events')"
+                :class="['nav-btn', { active: activeView === 'events' }]"
+              >
+                <i class="fas fa-calendar-alt me-2"></i>Events
+              </button>
+            </div>
+          </div>
+
+          <!-- Scrollable Listings -->
           <div class="col-md-8 listing-column">
-            <Locale_listing_container :locals="locals" :mode="'all'" />
+            <Locale_listing_container
+              v-if="activeView === 'locals'"
+              :locals="locals"
+              :mode="'all'"
+            />
+            <Event_listing_container v-else :events="allEvents" />
           </div>
         </div>
@@ -131,4 +222,41 @@
   margin-bottom: 0.5rem;
   border-bottom: 1px solid #dee2e6;
+}
+
+.navigation-toggle {
+  display: flex;
+  gap: 1rem;
+  padding: 1rem 1rem 0.5rem 1rem;
+  background-color: #f3f5f8;
+}
+
+.nav-btn {
+  flex: 1;
+  padding: 0.75rem 1.5rem;
+  background-color: #fff;
+  border: 2px solid #dee2e6;
+  border-radius: 8px;
+  font-weight: 500;
+  color: #6c757d;
+  cursor: pointer;
+  transition: all 0.3s ease;
+  font-size: 1rem;
+}
+
+.nav-btn:hover {
+  background-color: #f8f9fa;
+  border-color: #5ea5bc;
+  color: #5ea5bc;
+}
+
+.nav-btn.active {
+  background-color: #5ea5bc;
+  border-color: #5ea5bc;
+  color: #fff;
+  box-shadow: 0 2px 8px rgba(94, 165, 188, 0.3);
+}
+
+.nav-btn i {
+  font-size: 1.1rem;
 }
 
@@ -170,5 +298,7 @@
 .fade-enter-active,
 .fade-leave-active {
-  transition: opacity 0.3s ease, transform 0.3s ease;
+  transition:
+    opacity 0.3s ease,
+    transform 0.3s ease;
 }
 
@@ -182,4 +312,14 @@
   .events-section-wrapper {
     padding: 0.5rem 0;
+  }
+
+  .navigation-toggle {
+    padding: 0.75rem 0.75rem 0.5rem 0.75rem;
+    gap: 0.5rem;
+  }
+
+  .nav-btn {
+    padding: 0.6rem 1rem;
+    font-size: 0.9rem;
   }
 
Index: ReserveNGo-frontend/src/components/Project/Restaurant/search_filter_panel.vue
===================================================================
--- ReserveNGo-frontend/src/components/Project/Restaurant/search_filter_panel.vue	(revision a2cf76ef39eb9ad9c31f4239648f3ae7a7d0c764)
+++ ReserveNGo-frontend/src/components/Project/Restaurant/search_filter_panel.vue	(revision 12c76de49cc7c41bf9613e50b1726d57c07f9e00)
@@ -1,9 +1,50 @@
 <script setup lang="ts">
-import { computed, ref, watch } from 'vue'
+import { ref, watch, computed } from 'vue'
+
+const props = defineProps({
+  activeView: {
+    type: String,
+    default: 'locals',
+  },
+})
 
 const selectedFilters = ref([])
 
-/*const filterOptions = ['Open Now', 'Top Rated', 'Nearby']*/
-const filterOptions = { 'Open Now': 'isOpen', 'Top Rated': 'rating', Nearby: 'distance' }
+const localeFilterOptions = { 'Open Now': 'isOpen', 'Top Rated': 'rating', Nearby: 'distance' }
+const eventFilterOptions = {
+  Upcoming: 'upcoming',
+  'This Week': 'thisWeek',
+  'This Month': 'thisMonth',
+}
+
+const localeSortOptions = [
+  { value: '', text: 'Sort by' },
+  { value: 'name,asc', text: 'Name (A-Z)' },
+  { value: 'name,desc', text: 'Name (Z-A)' },
+  { value: 'rating', text: 'Rating' },
+  { value: 'newest', text: 'Newest' },
+]
+
+const eventSortOptions = [
+  { value: '', text: 'Sort by' },
+  { value: 'name,asc', text: 'Name (A-Z)' },
+  { value: 'name,desc', text: 'Name (Z-A)' },
+  { value: 'date,asc', text: 'Date (Soonest)' },
+  { value: 'date,desc', text: 'Date (Latest)' },
+  { value: 'newest', text: 'Newest' },
+]
+
+const filterOptions = computed(() => {
+  return props.activeView === 'locals' ? localeFilterOptions : eventFilterOptions
+})
+
+const sortOptions = computed(() => {
+  return props.activeView === 'locals' ? localeSortOptions : eventSortOptions
+})
+
+const placeholderText = computed(() => {
+  return props.activeView === 'locals' ? 'Search locales...' : 'Search events...'
+})
+
 const sortQuery = ref('')
 const searchInput = ref('')
@@ -11,4 +52,14 @@
 let debounceTimer = null
 const emit = defineEmits(['searchQuerySent'])
+
+// Reset filters when view changes
+watch(
+  () => props.activeView,
+  () => {
+    selectedFilters.value = []
+    sortQuery.value = ''
+    searchInput.value = ''
+  },
+)
 
 watch([searchInput, sortQuery, selectedFilters], (newValues) => {
@@ -18,5 +69,17 @@
     const [newSearchValue, newSortValue, newSelectedFilters] = newValues
     const [extractedSortValue, ascOrDsc = 'asc'] = newSortValue.split(',')
-    emit('searchQuerySent', newSearchValue, extractedSortValue, ascOrDsc, newSelectedFilters.includes('isOpen'))
+
+    if (props.activeView === 'locals') {
+      emit(
+        'searchQuerySent',
+        newSearchValue,
+        extractedSortValue,
+        ascOrDsc,
+        newSelectedFilters.includes('isOpen'),
+      )
+    } else {
+      // For events, we just pass the filters array, parent will handle it
+      emit('searchQuerySent', newSearchValue, extractedSortValue, ascOrDsc, newSelectedFilters)
+    }
   }, 400)
 })
@@ -33,5 +96,5 @@
           type="text"
           class="form-control"
-          placeholder="Search locales..."
+          :placeholder="placeholderText"
         />
       </div>
@@ -40,9 +103,13 @@
       <div class="col-6 col-md-3">
         <select v-model="sortQuery" class="form-select">
-          <option selected disabled>Sort by</option>
-          <option value="name,asc">Name (A-Z)</option>
-          <option value="name,desc">Name (Z-A)</option>
-          <option value="rating">Rating</option>
-          <option value="newest">Newest</option>
+          <option
+            v-for="option in sortOptions"
+            :key="option.value"
+            :value="option.value"
+            :selected="option.value === ''"
+            :disabled="option.value === ''"
+          >
+            {{ option.text }}
+          </option>
         </select>
       </div>
@@ -58,4 +125,7 @@
           >
             Filter
+            <span v-if="selectedFilters.length > 0" class="badge bg-primary ms-1">
+              {{ selectedFilters.length }}
+            </span>
           </button>
           <ul class="dropdown-menu p-2" style="min-width: 200px">
@@ -65,5 +135,5 @@
                   class="form-check-input"
                   type="checkbox"
-                  :id="key"
+                  :id="option"
                   :value="option"
                   v-model="selectedFilters"
@@ -81,3 +151,13 @@
 </template>
 
-<style scoped></style>
+<style scoped>
+.search-bar {
+  background-color: #f3f5f8;
+}
+
+.badge {
+  font-size: 0.7rem;
+  padding: 0.25rem 0.4rem;
+  border-radius: 10px;
+}
+</style>
Index: ReserveNGo-frontend/src/components/Project/Worker/WorkerReservationsDashboard.vue
===================================================================
--- ReserveNGo-frontend/src/components/Project/Worker/WorkerReservationsDashboard.vue	(revision a2cf76ef39eb9ad9c31f4239648f3ae7a7d0c764)
+++ ReserveNGo-frontend/src/components/Project/Worker/WorkerReservationsDashboard.vue	(revision 12c76de49cc7c41bf9613e50b1726d57c07f9e00)
@@ -116,5 +116,5 @@
     },
     canFinish(status) {
-      return status === 'PENDING' || status === 'ACCEPTED'
+      return status === 'ACCEPTED'
     },
     formatDate(timestamp) {
