Index: docs/todo.txt
===================================================================
--- docs/todo.txt	(revision e1c13920259173a131b3c2380ac66def5b5c73a7)
+++ docs/todo.txt	(revision 12027d377ca616c7a541d3f339d87153396ea53b)
@@ -4,2 +4,5 @@
 	Notifikacija za site so go koristat tagot
 	Mu izlegvit na moderatorot so go brisit negoviot tag kolku dusi go koristat tagot.
+	
+	
+Ko ke udris search bez filtri da ti gi davat grupirani. -> Edna grupa topics, druga projects treta tagoj so ti matchnale so kverito.
Index: src/main/java/com/db/finki/www/build_board/controller/HomePageController.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/controller/HomePageController.java	(revision e1c13920259173a131b3c2380ac66def5b5c73a7)
+++ src/main/java/com/db/finki/www/build_board/controller/HomePageController.java	(revision 12027d377ca616c7a541d3f339d87153396ea53b)
@@ -1,25 +1,39 @@
 package com.db.finki.www.build_board.controller;
 
+import com.db.finki.www.build_board.service.search.SearchService;
 import com.db.finki.www.build_board.service.threads.impl.NamedThreadService;
+import com.db.finki.www.build_board.service.threads.itfs.TagService;
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.Model;
 import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+
+import java.util.ArrayList;
+import java.util.List;
 
 @Controller
 public class HomePageController {
-    private final NamedThreadService namedThreadService;
+    private final SearchService searchService;
+    private final TagService tagService;
 
-    public HomePageController(NamedThreadService namedThreadService) {
-        this.namedThreadService = namedThreadService;
+    public HomePageController(SearchService searchService, TagService tagService) {
+        this.searchService = searchService;
+        this.tagService = tagService;
     }
 
     @GetMapping("/")
-    public String homePage(Model model) {
-        model.addAttribute("threads", namedThreadService.findAll());
-        return "home";
-    }
-    @GetMapping("/home")
-    public String home(Model model) {
+    public String search( @RequestParam(required = false)String query, @RequestParam(required = false) List<String> filters,  @RequestParam(required = false) String type , Model model) {
+        if(filters == null || filters.isEmpty()) {
+            filters = new ArrayList<>();
+            filters.add("all");
+        }
+
+        model.addAttribute("threads", searchService.search(query,filters,type));
+
+        System.out.println("TAGS: " + tagService.findAll());
+        model.addAttribute("tags",tagService.findAll());
         return "home";
     }
Index: src/main/java/com/db/finki/www/build_board/controller/SearchController.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/controller/SearchController.java	(revision e1c13920259173a131b3c2380ac66def5b5c73a7)
+++ src/main/java/com/db/finki/www/build_board/controller/SearchController.java	(revision 12027d377ca616c7a541d3f339d87153396ea53b)
@@ -30,5 +30,5 @@
         }
         model.addAttribute("threads", searchService.search(query,filters,type));
-        return "home";
+        return "/?";
     }
 }
Index: src/main/java/com/db/finki/www/build_board/entity/threads/Tag.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/entity/threads/Tag.java	(revision e1c13920259173a131b3c2380ac66def5b5c73a7)
+++ src/main/java/com/db/finki/www/build_board/entity/threads/Tag.java	(revision 12027d377ca616c7a541d3f339d87153396ea53b)
@@ -1,4 +1,5 @@
 package com.db.finki.www.build_board.entity.threads;
 
+import com.fasterxml.jackson.annotation.JsonIgnore;
 import jakarta.persistence.Entity;
 import jakarta.persistence.Id;
@@ -8,4 +9,5 @@
 import lombok.NoArgsConstructor;
 
+import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.List;
@@ -16,5 +18,5 @@
 @NoArgsConstructor
 @Table(name = "tag")
-public class Tag {
+public class Tag implements Serializable {
     @Id
     String name;
@@ -24,4 +26,5 @@
     }
 
+    @JsonIgnore
     @ManyToMany(mappedBy = "tags")
     private List<BBThread> threads = new ArrayList<>();
Index: src/main/java/com/db/finki/www/build_board/repository/threads/ProjectRepository.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/repository/threads/ProjectRepository.java	(revision e1c13920259173a131b3c2380ac66def5b5c73a7)
+++ src/main/java/com/db/finki/www/build_board/repository/threads/ProjectRepository.java	(revision 12027d377ca616c7a541d3f339d87153396ea53b)
@@ -3,8 +3,9 @@
 import com.db.finki.www.build_board.entity.threads.Project;
 import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
 import org.springframework.stereotype.Repository;
 
 @Repository
-public interface ProjectRepository extends JpaRepository<Project, Long> {
+public interface ProjectRepository extends JpaRepository<Project, Long>, JpaSpecificationExecutor<Project> {
     Project findByTitleStartingWith(String title);
     void deleteByTitle(String title);
Index: src/main/java/com/db/finki/www/build_board/service/search/FilterMap.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/service/search/FilterMap.java	(revision e1c13920259173a131b3c2380ac66def5b5c73a7)
+++ src/main/java/com/db/finki/www/build_board/service/search/FilterMap.java	(revision 12027d377ca616c7a541d3f339d87153396ea53b)
@@ -11,10 +11,9 @@
 
 @Component
-@Scope("prototype")
 public class FilterMap<T extends NamedThread> {
     private final Map<String, Function<String, Specification<T>>> filterMap;
+
     public FilterMap() {
         filterMap = new HashMap<>();
-        filterMap.put("all", s -> Specification.where(null));
         filterMap.put("title", (param) -> {
             if (param == null) {
@@ -24,5 +23,5 @@
             }
         });
-        filterMap.put("content",(param) -> {
+        filterMap.put("content", (param) -> {
             if (param == null) {
                 return (root, query, cb) -> null;
@@ -31,6 +30,12 @@
             }
         });
+        filterMap.put("all", (param) -> {
+            Specification<T> spec = (root, query, cb) -> null;
+
+            return spec.or(filterMap.get("title").apply(param)).or(filterMap.get("content").apply(param));
+        });
 
     }
+
     public Function<String, Specification<T>> getFilter(String filter) {
         return filterMap.get(filter);
Index: src/main/java/com/db/finki/www/build_board/service/search/SearchFilterConfig.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/service/search/SearchFilterConfig.java	(revision 12027d377ca616c7a541d3f339d87153396ea53b)
+++ src/main/java/com/db/finki/www/build_board/service/search/SearchFilterConfig.java	(revision 12027d377ca616c7a541d3f339d87153396ea53b)
@@ -0,0 +1,20 @@
+package com.db.finki.www.build_board.service.search;
+
+import com.db.finki.www.build_board.entity.threads.Project;
+import com.db.finki.www.build_board.entity.threads.Topic;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+public class SearchFilterConfig {
+
+    @Bean
+    public FilterMap<Project> ProjectFilterMap() {
+        return new FilterMap<>();
+    }
+
+    @Bean
+    public FilterMap<Topic> TopicFilterMap() {
+        return new FilterMap<>();
+    }
+}
Index: src/main/java/com/db/finki/www/build_board/service/search/SearchServiceImpl.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/service/search/SearchServiceImpl.java	(revision e1c13920259173a131b3c2380ac66def5b5c73a7)
+++ src/main/java/com/db/finki/www/build_board/service/search/SearchServiceImpl.java	(revision 12027d377ca616c7a541d3f339d87153396ea53b)
@@ -24,8 +24,8 @@
 
     @Autowired
-    public SearchServiceImpl(TopicRepository topicRepository, FilterMap<Topic> topicFilterMap, FilterMap<Project> projectFilterMap, ProjectRepository projectRepository, NamedThreadService namedThreadService) {
+    public SearchServiceImpl(TopicRepository topicRepository, FilterMap<Topic> TopicFilterMap, FilterMap<Project> ProjectFilterMap, ProjectRepository projectRepository, NamedThreadService namedThreadService) {
         this.topicRepository = topicRepository;
-        this.topicFilterMap = topicFilterMap;
-        this.projectFilterMap = projectFilterMap;
+        this.topicFilterMap = TopicFilterMap;
+        this.projectFilterMap = ProjectFilterMap;
         this.projectRepository = projectRepository;
         this.namedThreadService = namedThreadService;
@@ -54,4 +54,7 @@
     public List<NamedThread> search(String query, List<String> filters,String type) {
         List<NamedThread> result = new ArrayList<>();
+        if(type == null){
+            type = "all";
+        }
 
         if(Objects.equals(type, "project")){
Index: src/main/resources/templates/home.html
===================================================================
--- src/main/resources/templates/home.html	(revision e1c13920259173a131b3c2380ac66def5b5c73a7)
+++ src/main/resources/templates/home.html	(revision 12027d377ca616c7a541d3f339d87153396ea53b)
@@ -49,12 +49,18 @@
     <div class="row justify-content-end">
         <div class="col-md-8 pt-5">
-            <form action="/search" method="post" class="row g-3 align-items-center">
+            <form action="/" method="get" class="row g-3 align-items-center">
                 <!-- Search Input and Button -->
                 <div class="col-auto flex-grow-1">
-                    <div class="input-group">
-                        <span class="input-group-text bg-light border-0">
-                            <i class="fas fa-search"></i>
-                        </span>
-                        <input type="text" class="form-control" placeholder="Search..." name="query">
+                    <div class="input-group position-relative">
+        <span class="input-group-text bg-light border-0">
+            <i class="fas fa-search"></i>
+        </span>
+                        <input type="text" class="form-control" placeholder="Search..." name="query" id="search-input">
+                        <!-- Dropdown container -->
+                        <div>
+                            <div id="suggestions" class="dropdown-menu show position-absolute"
+                                 style="top: 100%; left: 0; z-index: 1000; display: none;">
+                            </div>
+                        </div>
                     </div>
                 </div>
@@ -65,16 +71,21 @@
                 </div>
 
+
                 <!-- Filters -->
-                <div class="col-12 d-flex align-items-center">
-                    <span class="me-2">Filters:</span>
-                    <div class="form-check me-3">
-                        <input class="form-check-input" type="checkbox" id="filterTitle" name="filters" value="title">
-                        <label class="form-check-label" for="filterTitle">Title</label>
+                <div class="col-12 d-flex gap-2 flex-column">
+                    <div class="col-12 d-flex">
+                        <span class="me-2">Filters:</span>
+                        <div class="form-check me-3 d-flex align-items-center">
+                            <input class="form-check-input me-2" type="checkbox" id="filterTitle" name="filters"
+                                   value="title">
+                            <label class="form-check-label" for="filterTitle">Title</label>
+                        </div>
+                        <div class="form-check me-3 d-flex align-items-center">
+                            <input class="form-check-input me-2" type="checkbox" id="filterContent" name="filters"
+                                   value="content">
+                            <label class="form-check-label" for="filterContent">Content</label>
+                        </div>
                     </div>
-                    <div class="form-check me-3">
-                        <input class="form-check-input" type="checkbox" id="filterContent" name="filters" value="content">
-                        <label class="form-check-label" for="filterContent">Content</label>
-                    </div>
-                    <div class="form-group me-3">
+                    <div class="form-group me-3 d-flex flex-row">
                         <label for="filterType" class="me-2">Type:</label>
                         <select class="form-select form-select-sm w-auto" id="filterType" name="type">
@@ -85,10 +96,10 @@
                     </div>
                 </div>
+
+
             </form>
         </div>
     </div>
 </div>
-
-
 
 
@@ -116,4 +127,45 @@
 </main>
 
+<script th:inline="javascript">
+    let searchInput = document.getElementById("search-input");
+    let suggestionsContainer = document.getElementById("suggestions");
+    let tags = /*[[${tags}]]*/ []; // kolku e glupa sintaksava gospode boze
+    let tagNames = tags.map(tag => tag.name);
+    let suggestionHeader = document.getElementById("suggestion-header");
+
+    function renderSuggestions(suggestions) {
+        suggestionsContainer.innerHTML = "";
+        if (suggestions.length === 0) {
+            suggestionsContainer.style.display = "none";
+            return;
+        }
+        suggestionsContainer.style.display = "block";
+        suggestions.forEach(tagName => {
+            let suggestionItem = document.createElement("a");
+            suggestionItem.href = "#";
+            suggestionItem.classList.add("dropdown-item");
+            suggestionItem.textContent = tagName;
+            suggestionItem.addEventListener("click", (e) => {
+                e.preventDefault();
+                searchInput.value = tagName;
+                suggestionsContainer.style.display = "none";
+            });
+            suggestionsContainer.appendChild(suggestionItem);
+        });
+    }
+
+    searchInput.addEventListener("input", () => {
+        let value = searchInput.value.toLowerCase();
+        let filteredTags = tagNames.filter(tag => tag.toLowerCase().includes(value));
+        renderSuggestions(filteredTags);
+    });
+
+    document.addEventListener("click", (e) => {
+        if (!suggestionsContainer.contains(e.target) && e.target !== searchInput) {
+            suggestionsContainer.style.display = "none";
+        }
+    });
+</script>
+
 <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
 </body>
Index: src/main/resources/templates/show-topic.html
===================================================================
--- src/main/resources/templates/show-topic.html	(revision e1c13920259173a131b3c2380ac66def5b5c73a7)
+++ src/main/resources/templates/show-topic.html	(revision 12027d377ca616c7a541d3f339d87153396ea53b)
@@ -157,4 +157,25 @@
 <!--</div>-->
 
+<script>
+    document.addEventListener("DOMContentLoaded", function () {
+        const existingTags = document.getElementById("existingTags");
+        const customTagInput = document.getElementById("customTag");
+        existingTags.addEventListener("change", function () {
+            if (this.value === "custom") {
+                customTagInput.classList.remove("d-none");
+                customTagInput.required = true;
+                customTagInput.name = "tagName";
+                existingTags.name = "";
+            } else {
+                customTagInput.classList.add("d-none");
+                customTagInput.required = false;
+                customTagInput.name = "";
+                existingTags.name = "tagName";
+                customTagInput.value = "";
+            }
+        });
+    });
+</script>
+
 <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
 </body>
