Index: ReserveNGo-backend/Dockerfile
===================================================================
--- ReserveNGo-backend/Dockerfile	(revision ec3fc6d0472d82bc722a231ac4a551e629b8c413)
+++ ReserveNGo-backend/Dockerfile	(revision 9193fdf855f05933bda56a75e804484ec1be5c01)
@@ -11,2 +11,3 @@
 EXPOSE 8080
 ENTRYPOINT ["java", "-jar", "app.jar"]
+
Index: ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/config/WebSecurityConfig.java
===================================================================
--- ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/config/WebSecurityConfig.java	(revision ec3fc6d0472d82bc722a231ac4a551e629b8c413)
+++ ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/config/WebSecurityConfig.java	(revision 9193fdf855f05933bda56a75e804484ec1be5c01)
@@ -42,4 +42,5 @@
 
         http.csrf(AbstractHttpConfigurer::disable)
+                .cors(cors -> cors.configure(http))
                 .headers((headers) -> headers
                         .frameOptions(HeadersConfigurer.FrameOptionsConfig::sameOrigin))
Index: ReserveNGo-frontend/Dockerfile
===================================================================
--- ReserveNGo-frontend/Dockerfile	(revision 9193fdf855f05933bda56a75e804484ec1be5c01)
+++ ReserveNGo-frontend/Dockerfile	(revision 9193fdf855f05933bda56a75e804484ec1be5c01)
@@ -0,0 +1,28 @@
+# ---------- Build stage ----------
+FROM node:20-alpine AS build
+
+WORKDIR /app
+
+ARG VITE_API_BASE_URL
+ARG VITE_GOOGLE_CLIENT_ID
+
+COPY package*.json ./
+RUN npm ci
+
+COPY . .
+
+RUN npm run build
+
+
+# ---------- Runtime stage ----------
+FROM nginx:alpine
+
+RUN rm /etc/nginx/conf.d/default.conf
+
+COPY nginx.conf /etc/nginx/conf.d/default.conf
+
+COPY --from=build /app/dist /usr/share/nginx/html
+
+EXPOSE 80
+
+CMD ["nginx", "-g", "daemon off;"]
Index: ReserveNGo-frontend/nginx.conf
===================================================================
--- ReserveNGo-frontend/nginx.conf	(revision 9193fdf855f05933bda56a75e804484ec1be5c01)
+++ ReserveNGo-frontend/nginx.conf	(revision 9193fdf855f05933bda56a75e804484ec1be5c01)
@@ -0,0 +1,17 @@
+server {
+    listen 80;
+    server_name localhost;
+
+    root /usr/share/nginx/html;
+    index index.html;
+
+    # SPA routing
+    location / {
+        try_files $uri $uri/ /index.html;
+    }
+
+    location ~* \.(js|css|png|jpg|jpeg|gif|svg|ico|woff2?)$ {
+        expires 1y;
+        add_header Cache-Control "public, immutable";
+    }
+}
Index: ReserveNGo-frontend/src/components/Project/Event/events_carousel.vue
===================================================================
--- ReserveNGo-frontend/src/components/Project/Event/events_carousel.vue	(revision ec3fc6d0472d82bc722a231ac4a551e629b8c413)
+++ ReserveNGo-frontend/src/components/Project/Event/events_carousel.vue	(revision 9193fdf855f05933bda56a75e804484ec1be5c01)
@@ -80,13 +80,9 @@
 
   mounted() {
-    // Call the method once on the component mount to set the initial state.
     this.updateItemsPerSlide()
-    // Add an event listener for window resizing.
     window.addEventListener('resize', this.updateItemsPerSlide)
   },
 
   beforeUnmount() {
-    // IMPORTANT: Remove the event listener when the component is destroyed
-    // to prevent memory leaks.
     window.removeEventListener('resize', this.updateItemsPerSlide)
   },
Index: ReserveNGo-frontend/src/components/Project/Worker/WorkerReservationsDashboard.vue
===================================================================
--- ReserveNGo-frontend/src/components/Project/Worker/WorkerReservationsDashboard.vue	(revision ec3fc6d0472d82bc722a231ac4a551e629b8c413)
+++ ReserveNGo-frontend/src/components/Project/Worker/WorkerReservationsDashboard.vue	(revision 9193fdf855f05933bda56a75e804484ec1be5c01)
@@ -263,14 +263,18 @@
             </th>
 
-            <th style="cursor: pointer" @click="sortBy('tableCapacity')">
-              Capacity
-              <span v-if="sortKey === 'tableCapacity'">
-                {{ sortOrder === 'asc' ? '↑' : '↓' }}
-              </span>
-            </th>
-
             <th style="cursor: pointer" @click="sortBy('reservationStatus')">
               Status
               <span v-if="sortKey === 'reservationStatus'">
+                {{ sortOrder === 'asc' ? '↑' : '↓' }}
+              </span>
+            </th>
+
+            <th>
+              Description
+            </th>
+
+            <th style="cursor: pointer" @click="sortBy('capacity')">
+              Capacity
+              <span v-if="sortKey === 'capacity'">
                 {{ sortOrder === 'asc' ? '↑' : '↓' }}
               </span>
@@ -293,5 +297,4 @@
             <td>{{ reservation.customerName }}</td>
             <td>{{ formatDate(reservation.timeOfReservation) }}</td>
-            <td>{{ reservation.tableCapacity }}</td>
             <td>
               <span class="badge bg-secondary">
@@ -299,4 +302,6 @@
               </span>
             </td>
+            <td>{{ reservation.description }}</td>
+            <td>{{ reservation.capacity }}</td>
 
             <td class="text-end">
@@ -336,5 +341,5 @@
 
           <tr v-if="filteredReservations.length === 0">
-            <td :colspan="selectionMode ? 6 : 5" class="text-center text-muted py-4">
+            <td :colspan="selectionMode ? 7 : 6" class="text-center text-muted py-4">
               No reservations found.
             </td>
Index: ReserveNGo-frontend/src/components/Project/home_.vue
===================================================================
--- ReserveNGo-frontend/src/components/Project/home_.vue	(revision ec3fc6d0472d82bc722a231ac4a551e629b8c413)
+++ ReserveNGo-frontend/src/components/Project/home_.vue	(revision 9193fdf855f05933bda56a75e804484ec1be5c01)
@@ -5,4 +5,5 @@
 import Events_carousel from '@/components/Project/Event/events_carousel.vue'
 import { ensureEventDateTime } from '@/mixins/utilFunctions'
+import { userStore } from '@/PiniaStores/UserStore.js'
 
 import { useEvents } from '@/repository/Events.ts'
@@ -25,4 +26,5 @@
       favouriteLocals: [],
       favouriteEvents: [],
+      user: userStore(),
 
       activeView: 'locals',
@@ -110,5 +112,5 @@
         .then((data) => {
           this.carouselEvents = data.events
-          console.log("EVENTS", data.events)
+          console.log('EVENTS', data.events)
         })
         .catch((err) => console.log('Failed fetching carousel events', err))
@@ -233,6 +235,11 @@
 
         // ALWAYS load favourites (needed for correct toggle state)
-        await this.loadFavouriteEvents()
-        await this.loadFavouriteLocals()
+        if (this.user.data.role === 'ROLE_CUSTOMER') {
+          await this.loadFavouriteEvents()
+          await this.loadFavouriteLocals()
+        } else {
+          this.favouriteEvents = []
+          this.favouriteLocals = []
+        }
 
         if (!this.isFavouritesMode) {
Index: docker-compose.yml
===================================================================
--- docker-compose.yml	(revision ec3fc6d0472d82bc722a231ac4a551e629b8c413)
+++ docker-compose.yml	(revision 9193fdf855f05933bda56a75e804484ec1be5c01)
@@ -1,3 +1,15 @@
 services:
+  frontend:
+    build:
+      context: ./ReserveNGo-frontend
+      dockerfile: Dockerfile
+      args:
+        VITE_API_BASE_URL: http://localhost:8080
+        VITE_GOOGLE_CLIENT_ID: ${VITE_GOOGLE_CLIENT_ID}
+    ports:
+      - "5173:80"
+    depends_on:
+      - backend
+
   backend:
     build:
