Index: frontend/src/components/StudentForm/StudentForm.tsx
===================================================================
--- frontend/src/components/StudentForm/StudentForm.tsx	(revision 95bb4a49b7d413dc478d173b45cedd54882f2f92)
+++ frontend/src/components/StudentForm/StudentForm.tsx	(revision cc05ef98e53004cf217e64d56780113f944c905c)
@@ -1,3 +1,3 @@
-import { useEffect, useState } from "react";
+import { Dispatch, SetStateAction, useEffect, useState } from "react";
 import {
 	EVALUATIONS,
@@ -10,4 +10,5 @@
 import { Programs, StudentData, Subject } from "../types";
 import SkeletonForm from "./SkeletonForm";
+import SubjectsSelector from "./SubjectsSelector";
 import { LatinToCyrillic } from "./utils";
 
@@ -40,5 +41,7 @@
 		formData?.preferred_domains || []
 	);
-	const [electiveSearchTerm, setElectiveSearchTerm] = useState("");
+	const [semesterSearchTerms, setSemesterSearchTerms] = useState<
+		Record<number, string>
+	>({});
 	const [professorsSearchTerm, setProfessorSearchTerm] = useState("");
 	const [technologies, setTechnologies] = useState<string[]>(
@@ -51,4 +54,10 @@
 		formData?.favorite_professors || []
 	);
+	const [isNemamSelected, setIsNemamSelected] = useState({
+		domains: false,
+		tech: false,
+		eval: false,
+		prof: false,
+	});
 	const [formStatus, setFormStatus] = useState<{
 		isSubmitting: boolean;
@@ -60,5 +69,4 @@
 		isError: false,
 	});
-	const [showElective, setShowElective] = useState(false);
 	const [showProfessors, setShowProfessors] = useState(false);
 	const [subjects, setSubjects] = useState<Subject[]>([]);
@@ -233,4 +241,46 @@
 	};
 
+	const FieldButton: React.FC<{
+		keyProp: string | number;
+		state: string[];
+		stateSetter: Dispatch<SetStateAction<any[]>>;
+		field: "prof" | "tech" | "eval" | "domains";
+		isSelected: boolean;
+		isDisabled: boolean;
+	}> = ({ keyProp, state, stateSetter, field, isSelected, isDisabled }) => {
+		const handleClick = () => {
+			if (keyProp === "Немам") {
+				if (state.includes("Немам")) {
+					stateSetter([]);
+				} else {
+					stateSetter(["Немам"]);
+				}
+				setIsNemamSelected((prev) => ({
+					...prev,
+					[field]: !prev[field],
+				}));
+			} else {
+				const new_ = state.filter((t) => t !== "Немам");
+				toggleSelection(keyProp, stateSetter, new_);
+			}
+		};
+
+		return (
+			<button
+				type="button"
+				key={keyProp}
+				onClick={handleClick}
+				disabled={isDisabled}
+				className={`px-3 py-2 border rounded-md transition-colors ${
+					isSelected
+						? "bg-yellow-100 border-yellow-300 text-yellow-800"
+						: "bg-white hover:bg-gray-50 border-gray-300"
+				} ${isDisabled ? "opacity-50 cursor-not-allowed" : ""}`}
+			>
+				{keyProp}
+			</button>
+		);
+	};
+
 	const filteredMandatorySubjects = studyTrack
 		? subjects
@@ -243,16 +293,10 @@
 		: [];
 	const filteredElectiveSubjects = studyTrack
-		? subjects
-				.filter(
-					(subj) =>
-						subj.subject_info.elective_for.includes(studyTrack) &&
-						(electiveSearchTerm == "" ||
-							subj.name
-								.toLowerCase()
-								.includes(LatinToCyrillic(electiveSearchTerm).toLowerCase()))
-					// subj.subject_info.semester <= year * 2
-				)
-				.sort((a, b) => a.subject_info.semester - b.subject_info.semester)
-		: [];
+		? subjects.filter(
+				(subj) => subj.subject_info.elective_for.includes(studyTrack)
+				// subj.subject_info.semester <= year * 2
+		  )
+		: // .sort((a, b) => a.subject_info.semester - b.subject_info.semester)
+		  [];
 
 	const filteredProfessors = distinctSubjectData.professors.filter(
@@ -275,5 +319,4 @@
 					: "Внеси податоци"}
 			</h2>
-
 			{formStatus.message && (
 				<div
@@ -325,5 +368,4 @@
 				</div>
 			</div>
-
 			<div>
 				<h3 className="text-lg font-medium text-gray-900 mb-2">
@@ -347,175 +389,15 @@
 				)}
 			</div>
-
-			<div>
-				{/* <div className="flex gap-5 items-center mb-2"> */}
-				<h3 className="text-lg font-medium text-gray-900 mb-2">
-					Положени задолжителни предмети
-				</h3>
-				{studyTrack != "" && (
-					<div className="flex items-center mb-2">
-						<label className="inline-flex items-center p-1 rounded">
-							<input
-								type="checkbox"
-								className="form-checkbox h-5 w-5 accent-green-600"
-								disabled={filteredMandatorySubjects.length === 0}
-								checked={filteredMandatorySubjects.every((subject) =>
-									passedSubjects.some((passed) => passed.id === subject.id)
-								)}
-								onChange={() => {
-									const allSelected = filteredMandatorySubjects.every(
-										(subject) =>
-											passedSubjects.some((passed) => passed.id === subject.id)
-									);
-
-									if (allSelected) {
-										setPassedSubjects((prev) =>
-											prev.filter(
-												(subject) =>
-													!filteredMandatorySubjects.some(
-														(mandatorySubj) => mandatorySubj.id === subject.id
-													)
-											)
-										);
-									} else {
-										setPassedSubjects((prev) => {
-											const newSubjects = filteredMandatorySubjects.filter(
-												(subject) =>
-													!prev.some((passed) => passed.id === subject.id)
-											);
-											return [...prev, ...newSubjects];
-										});
-									}
-								}}
-							/>
-							<span className="ml-2 text-md text-gray-700">Одбери ги сите</span>
-						</label>
-					</div>
-				)}
-				{filteredMandatorySubjects.length > 0 ? (
-					<div className="flex flex-wrap gap-2">
-						{filteredMandatorySubjects.map((subject) => {
-							const isSelected = passedSubjects.some(
-								(s) => s.id === subject.id
-							);
-							return (
-								<button
-									type="button"
-									key={subject.id}
-									onClick={() => toggleSubject(subject)}
-									className={`flex items-center gap-2 px-3 py-2 border rounded-md transition-all duration-200 
-                    ${
-											isSelected
-												? "bg-green-500 border-green-600 text-green-50"
-												: "bg-white hover:bg-gray-50 border-gray-300"
-										}`}
-									aria-pressed={isSelected}
-								>
-									{isSelected && (
-										<svg
-											className="w-5 h-5"
-											fill="none"
-											stroke="currentColor"
-											viewBox="0 0 24 24"
-										>
-											<path
-												strokeLinecap="round"
-												strokeLinejoin="round"
-												strokeWidth="2"
-												d="M5 13l4 4L19 7"
-											></path>
-										</svg>
-									)}
-									<span>{subject.name}</span>
-								</button>
-							);
-						})}
-					</div>
-				) : (
-					<p className="text-gray-500 italic">
-						{!studyTrack
-							? "Одбери смер и година за да се прикажат предметите."
-							: "Нема такви задолжителни предмети"}
-					</p>
-				)}
-				{validationErrors.passedSubjects && (
-					<p className="mt-1 text-sm text-red-600 font-bold">
-						{validationErrors.passedSubjects}
-					</p>
-				)}
-			</div>
-			<div>
-				<div className="flex items-center mb-2 gap-7">
-					<h3 className="text-lg font-medium text-gray-900">
-						Положени изборни предмети
-					</h3>
-					{studyTrack != "" && (
-						<input
-							onChange={(e) => setElectiveSearchTerm(e.target.value)}
-							value={electiveSearchTerm}
-							type="text"
-							className="w-60 px-3 py-2.5 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500 text-gray-900 text-sm"
-							placeholder="Пребарај предмет"
-						/>
-					)}
-				</div>
-				{filteredElectiveSubjects.length > 0 ? (
-					<div className="flex flex-wrap gap-2">
-						{filteredElectiveSubjects
-							.slice(0, showElective ? undefined : 10)
-							.map((subject) => {
-								const isSelected = passedSubjects.some(
-									(s) => s.id === subject.id
-								);
-								return (
-									<button
-										type="button"
-										key={subject.id}
-										onClick={() => toggleSubject(subject)}
-										className={`flex items-center gap-2 px-3 py-2 border rounded-md transition-all duration-200 
-                    					${
-																isSelected
-																	? "bg-green-500 text-white border-green-600 shadow-md"
-																	: "bg-white text-gray-800 border-gray-300 hover:bg-gray-100"
-															}`}
-										aria-pressed={isSelected}
-									>
-										{isSelected && (
-											<svg
-												className="w-5 h-5"
-												fill="none"
-												stroke="currentColor"
-												viewBox="0 0 24 24"
-											>
-												<path
-													strokeLinecap="round"
-													strokeLinejoin="round"
-													strokeWidth="2"
-													d="M5 13l4 4L19 7"
-												></path>
-											</svg>
-										)}
-										<span>{subject.name}</span>
-									</button>
-								);
-							})}
-						{filteredElectiveSubjects.length > 10 && (
-							<button
-								onClick={() => setShowElective(!showElective)}
-								className="px-3 py-2 rounded-md transition-colors duration-200 bg-blue text-blue-500"
-							>
-								{showElective ? "Прикажи помалку" : "Прикажи повеќе"}
-							</button>
-						)}
-					</div>
-				) : (
-					<p className="text-gray-500 italic">
-						{!studyTrack
-							? "Одбери смер и година за да се прикажат предметите"
-							: "Нема такви изборни предмети"}
-					</p>
-				)}
-			</div>
-
+			<SubjectsSelector
+				studyTrack={studyTrack}
+				year={year}
+				filteredMandatorySubjects={filteredMandatorySubjects}
+				filteredElectiveSubjects={filteredElectiveSubjects}
+				passedSubjects={passedSubjects}
+				toggleSubject={toggleSubject}
+				semesterSearchTerms={semesterSearchTerms}
+				setSemesterSearchTerms={setSemesterSearchTerms}
+				validationErrors={validationErrors}
+			/>
 			<div>
 				<h3 className="text-lg font-medium text-gray-900 mb-2">
@@ -565,5 +447,4 @@
 				)}
 			</div>
-
 			<div>
 				<h3 className="text-lg font-medium text-gray-900 mb-2">
@@ -571,33 +452,18 @@
 				</h3>
 				<div className="flex flex-wrap gap-2">
-					{distinctSubjectData.tags.map((domain) => {
-						const isSelected = domains.includes(domain);
-						const isNemamSelected = domains.includes("Немам");
-						const shouldBeDisabled = isNemamSelected && domain !== "Немам";
+					{["Немам", ...distinctSubjectData.tags].map((item) => {
+						const isSelected = domains.includes(item);
+						const shouldBeDisabled =
+							isNemamSelected["domains"] && item !== "Немам";
 						return (
-							<button
-								type="button"
-								key={domain}
-								onClick={() => {
-									if (domain === "Немам") {
-										if (domains.includes("Немам")) {
-											setDomains([]);
-										} else {
-											setDomains(["Немам"]);
-										}
-									} else {
-										const newDomains = domains.filter((t) => t !== "Немам");
-										toggleSelection(domain, setDomains, newDomains);
-									}
-								}}
-								disabled={shouldBeDisabled}
-								className={`px-3 py-2 border rounded-md transition-colors ${
-									isSelected
-										? "bg-green-100 border-green-300 text-green-800"
-										: "bg-white hover:bg-gray-50 border-gray-300"
-								} ${shouldBeDisabled ? "opacity-50 cursor-not-allowed" : ""}`}
-							>
-								{domain}
-							</button>
+							<FieldButton
+								key={item}
+								keyProp={item}
+								state={domains}
+								stateSetter={setDomains}
+								field="domains"
+								isSelected={isSelected}
+								isDisabled={shouldBeDisabled}
+							/>
 						);
 					})}
@@ -609,5 +475,4 @@
 				)}
 			</div>
-
 			<div>
 				<h3 className="text-lg font-medium text-gray-900 mb-2">
@@ -615,33 +480,18 @@
 				</h3>
 				<div className="flex flex-wrap gap-2">
-					{distinctSubjectData.technologies.map((tech) => {
-						const isSelected = technologies.includes(tech);
-						const isNemamSelected = technologies.includes("Немам");
-						const shouldBeDisabled = isNemamSelected && tech !== "Немам";
+					{["Немам", ...distinctSubjectData.technologies].map((item) => {
+						const isSelected = technologies.includes(item);
+						const shouldBeDisabled =
+							isNemamSelected["tech"] && item !== "Немам";
 						return (
-							<button
-								type="button"
-								key={tech}
-								onClick={() => {
-									if (tech === "Немам") {
-										if (technologies.includes("Немам")) {
-											setTechnologies([]);
-										} else {
-											setTechnologies(["Немам"]);
-										}
-									} else {
-										const newTechs = technologies.filter((t) => t !== "Немам");
-										toggleSelection(tech, setTechnologies, newTechs);
-									}
-								}}
-								disabled={shouldBeDisabled}
-								className={`px-3 py-2 border rounded-md transition-colors ${
-									isSelected
-										? "bg-yellow-100 border-yellow-300 text-yellow-800"
-										: "bg-white hover:bg-gray-50 border-gray-300"
-								} ${shouldBeDisabled ? "opacity-50 cursor-not-allowed" : ""}`}
-							>
-								{tech}
-							</button>
+							<FieldButton
+								key={item}
+								keyProp={item}
+								state={technologies}
+								stateSetter={setTechnologies}
+								field="tech"
+								isSelected={isSelected}
+								isDisabled={shouldBeDisabled}
+							/>
 						);
 					})}
@@ -653,5 +503,4 @@
 				)}
 			</div>
-
 			<div>
 				<h3 className="text-lg font-medium text-gray-900 mb-2">
@@ -659,36 +508,18 @@
 				</h3>
 				<div className="flex flex-wrap gap-2">
-					{EVALUATIONS.map((ev) => {
-						const isSelected = evaluation.includes(ev);
-						const isNemamSelected = evaluation.includes("Немам");
-						const shouldBeDisabled = isNemamSelected && ev !== "Немам";
+					{["Немам", ...EVALUATIONS].map((item) => {
+						const isSelected = evaluation.includes(item);
+						const shouldBeDisabled =
+							isNemamSelected["eval"] && item !== "Немам";
 						return (
-							<button
-								type="button"
-								key={ev}
-								onClick={() => {
-									// todo: sredi ova
-									if (ev === "Немам") {
-										if (evaluation.includes("Немам")) {
-											setEvaluation([]);
-										} else {
-											setEvaluation(["Немам"]);
-										}
-									} else {
-										const newEvaluation = evaluation.filter(
-											(t) => t !== "Немам"
-										);
-										toggleSelection(ev, setEvaluation, newEvaluation);
-									}
-								}}
-								disabled={shouldBeDisabled}
-								className={`px-3 py-2 border rounded-md transition-colors ${
-									isSelected
-										? "bg-green-100 border-green-300 text-green-800"
-										: "bg-white hover:bg-gray-50 border-gray-300"
-								} ${shouldBeDisabled ? "opacity-50 cursor-not-allowed" : ""}`}
-							>
-								{ev}
-							</button>
+							<FieldButton
+								key={item}
+								keyProp={item}
+								state={evaluation}
+								stateSetter={setEvaluation}
+								field="eval"
+								isSelected={isSelected}
+								isDisabled={shouldBeDisabled}
+							/>
 						);
 					})}
@@ -700,5 +531,4 @@
 				)}
 			</div>
-
 			<div>
 				<div className="flex items-center mb-2 gap-7">
@@ -710,4 +540,5 @@
 							onChange={(e) => setProfessorSearchTerm(e.target.value)}
 							value={professorsSearchTerm}
+							disabled={isNemamSelected["prof"]}
 							type="text"
 							className="w-60 px-3 py-2.5 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500 text-gray-900 text-sm"
@@ -717,22 +548,22 @@
 				</div>
 				<div className="flex flex-wrap gap-2">
-					{filteredProfessors
+					{["Немам", ...filteredProfessors]
 						.slice(0, showProfessors ? undefined : 10)
-						.map((prof) => (
-							<button
-								key={prof}
-								type="button"
-								onClick={() =>
-									toggleSelection(prof, setFavoriteProfs, favoriteProfs)
-								}
-								className={`px-3 py-2 border rounded-md transition-colors ${
-									favoriteProfs.includes(prof)
-										? "bg-pink-100 border-pink-300 text-pink-800"
-										: "bg-white hover:bg-gray-50 border-gray-300"
-								}`}
-							>
-								{prof}
-							</button>
-						))}
+						.map((item) => {
+							const isSelected = favoriteProfs.includes(item);
+							const shouldBeDisabled =
+								isNemamSelected["prof"] && item !== "Немам";
+							return (
+								<FieldButton
+									key={item}
+									keyProp={item}
+									state={favoriteProfs}
+									stateSetter={setFavoriteProfs}
+									field="prof"
+									isSelected={isSelected}
+									isDisabled={shouldBeDisabled}
+								/>
+							);
+						})}
 					{filteredProfessors.length == 0 && (
 						<p className="text-gray-500 italic">Нема таков професор</p>
@@ -748,5 +579,4 @@
 				</div>
 			</div>
-
 			<div className="pt-4">
 				<button
Index: frontend/src/components/StudentForm/SubjectsSelector.tsx
===================================================================
--- frontend/src/components/StudentForm/SubjectsSelector.tsx	(revision cc05ef98e53004cf217e64d56780113f944c905c)
+++ frontend/src/components/StudentForm/SubjectsSelector.tsx	(revision cc05ef98e53004cf217e64d56780113f944c905c)
@@ -0,0 +1,233 @@
+import { Subject } from "../types";
+import { LatinToCyrillic } from "./utils";
+
+interface SubjectsSelectorProps {
+	studyTrack: string;
+	year: number;
+	filteredMandatorySubjects: Subject[];
+	filteredElectiveSubjects: Subject[];
+	passedSubjects: Subject[];
+	toggleSubject: (subject: Subject) => void;
+	semesterSearchTerms: Record<number, string>;
+	setSemesterSearchTerms: (term: any) => void;
+	validationErrors: { [key: string]: string };
+}
+
+const TickSvg = () => (
+	<svg
+		className="w-4 h-4"
+		fill="none"
+		stroke="currentColor"
+		viewBox="0 0 24 24"
+	>
+		<path
+			strokeLinecap="round"
+			strokeLinejoin="round"
+			strokeWidth="2"
+			d="M5 13l4 4L19 7"
+		></path>
+	</svg>
+);
+
+function SubjectsSelector({
+	studyTrack,
+	year,
+	filteredMandatorySubjects,
+	filteredElectiveSubjects,
+	passedSubjects,
+	toggleSubject,
+	semesterSearchTerms,
+	setSemesterSearchTerms,
+	validationErrors,
+}: SubjectsSelectorProps) {
+	return (
+		<div>
+			<h3 className="text-lg font-medium text-gray-900 mb-4">
+				Положени предмети по семестри
+			</h3>
+
+			{studyTrack ? (
+				<div className="grid gap-6">
+					{(() => {
+						const semestersToShow = Array.from(
+							{ length: year * 2 },
+							(_, i) => i + 1
+						);
+
+						return semestersToShow.map((semester) => {
+							const semesterMandatory = filteredMandatorySubjects.filter(
+								(subject) => subject.subject_info.semester === semester
+							);
+
+							const semesterElectives = filteredElectiveSubjects.filter(
+								(subject) => subject.subject_info.semester === semester
+							);
+
+							// const semesterElectives = filteredElectiveSubjects;
+
+							const totalSlots = semester === 1 ? 5 : 6;
+							const electiveSlots = totalSlots - semesterMandatory.length;
+
+							const selectedElectivesForSemester = passedSubjects.filter(
+								(subject) =>
+									subject.subject_info.semester === semester &&
+									semesterElectives.some(
+										(elective) => elective.id === subject.id
+									)
+							);
+
+							return (
+								<div
+									key={semester}
+									className="border border-gray-200 rounded-lg p-4 bg-gray-50"
+								>
+									<h4 className="text-md font-medium text-gray-800 mb-3">
+										Семестар {semester}
+									</h4>
+
+									<div className="space-y-4">
+										{semesterMandatory.length > 0 && (
+											<div>
+												<h5 className="text-sm font-medium text-gray-700 mb-2">
+													Задолжителни предмети
+												</h5>
+												<div className="flex flex-wrap gap-2">
+													{semesterMandatory.map((subject) => {
+														const isSelected = passedSubjects.some(
+															(s) => s.id === subject.id
+														);
+														return (
+															<button
+																type="button"
+																key={subject.id}
+																onClick={() => toggleSubject(subject)}
+																className={`flex items-center gap-2 px-3 py-2 border rounded-md transition-all duration-200 text-sm
+                                  ${
+																		isSelected
+																			? "bg-green-500 border-green-600 text-green-50"
+																			: "bg-white hover:bg-gray-50 border-gray-300"
+																	}`}
+																aria-pressed={isSelected}
+															>
+																{isSelected && <TickSvg />}
+																<span>{subject.name}</span>
+															</button>
+														);
+													})}
+												</div>
+											</div>
+										)}
+
+										{electiveSlots > 0 && (
+											<div>
+												<h5 className="text-sm font-medium text-gray-700 mb-2">
+													Изборни предмети (
+													{selectedElectivesForSemester.length}/{electiveSlots})
+												</h5>
+
+												<input
+													type="text"
+													placeholder={`Пребарај изборни предмети за семестар ${semester}`}
+													value={semesterSearchTerms[semester] || ""}
+													className="w-full px-3 py-2 mb-2 text-sm border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500"
+													onChange={(e) => {
+														setSemesterSearchTerms((prev: any) => ({
+															...prev,
+															[semester]: e.target.value,
+														}));
+													}}
+												/>
+
+												{selectedElectivesForSemester.length > 0 && (
+													<div className="mb-3">
+														<div className="flex flex-wrap gap-2">
+															{selectedElectivesForSemester.map((subject) => (
+																<button
+																	type="button"
+																	key={subject.id}
+																	onClick={() => toggleSubject(subject)}
+																	className="flex items-center gap-2 px-3 py-2 border rounded-md transition-all duration-200 text-sm bg-green-500 text-white border-green-600 shadow-md"
+																	aria-pressed={true}
+																>
+																	<TickSvg />
+																	<span>{subject.name}</span>
+																</button>
+															))}
+														</div>
+													</div>
+												)}
+
+												{selectedElectivesForSemester.length <
+													electiveSlots && (
+													<div>
+														<p className="text-xs text-gray-600 mb-2">
+															Избери од достапните:
+														</p>
+														<div className="flex flex-wrap gap-2 max-h-32 overflow-y-auto">
+															{semesterElectives
+																.filter(
+																	(subject) =>
+																		!selectedElectivesForSemester.some(
+																			(selected) => selected.id === subject.id
+																		) &&
+																		((semesterSearchTerms[semester] || "") ===
+																			"" ||
+																			subject.name
+																				.toLowerCase()
+																				.includes(
+																					(
+																						LatinToCyrillic(
+																							semesterSearchTerms[semester]
+																						) || ""
+																					).toLowerCase()
+																				))
+																)
+																.slice(0, 8)
+																.map((subject) => (
+																	<button
+																		type="button"
+																		key={subject.id}
+																		onClick={() => {
+																			if (
+																				selectedElectivesForSemester.length <
+																				electiveSlots
+																			) {
+																				toggleSubject(subject);
+																			}
+																		}}
+																		disabled={
+																			selectedElectivesForSemester.length >=
+																			electiveSlots
+																		}
+																		className="flex items-center gap-2 px-3 py-2 border rounded-md transition-all duration-200 text-sm bg-white text-gray-800 border-gray-300 hover:bg-gray-100 disabled:opacity-50 disabled:cursor-not-allowed"
+																	>
+																		<span>{subject.name}</span>
+																	</button>
+																))}
+														</div>
+													</div>
+												)}
+											</div>
+										)}
+									</div>
+								</div>
+							);
+						});
+					})()}
+				</div>
+			) : (
+				<p className="text-gray-500 italic">
+					Одбери смер и година за да се прикажат предметите.
+				</p>
+			)}
+
+			{validationErrors.passedSubjects && (
+				<p className="mt-3 text-sm text-red-600 font-bold">
+					{validationErrors.passedSubjects}
+				</p>
+			)}
+		</div>
+	);
+}
+
+export default SubjectsSelector;
Index: frontend/src/components/SubjectCatalog/SubjectModal.tsx
===================================================================
--- frontend/src/components/SubjectCatalog/SubjectModal.tsx	(revision 95bb4a49b7d413dc478d173b45cedd54882f2f92)
+++ frontend/src/components/SubjectCatalog/SubjectModal.tsx	(revision cc05ef98e53004cf217e64d56780113f944c905c)
@@ -3,204 +3,201 @@
 
 interface SubjectModalProps {
-  selectedSubject: Subject;
-  subjectPrerequisites: string[] | number | "Нема предуслов";
-  closeModal: () => void;
+	selectedSubject: Subject;
+	subjectPrerequisites: string[] | number | "Нема предуслов";
+	closeModal: () => void;
 }
 
 function SubjectModal({
-  selectedSubject,
-  closeModal,
-  subjectPrerequisites,
+	selectedSubject,
+	closeModal,
+	subjectPrerequisites,
 }: SubjectModalProps) {
-  const [isExpanded, setIsExpanded] = useState(false);
-
-  const WORD_LIMIT = 40;
-
-  const truncateText = (text: string) => {
-    if (!text) return "";
-    const words = text.split(/\s+/);
-    console.log(words.slice(0, WORD_LIMIT).join(" ") + "...");
-    return words.length <= WORD_LIMIT
-      ? text
-      : words.slice(0, WORD_LIMIT).join(" ") + "...";
-  };
-
-  const canToggle = selectedSubject.abstract.split(/\s+/).length > WORD_LIMIT;
-  const abstractText = isExpanded
-    ? selectedSubject.abstract
-    : truncateText(selectedSubject.abstract);
-  return (
-    <>
-      <div className="fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center p-4 z-50">
-        <div className="bg-white rounded-lg shadow-xl max-w-2xl w-full max-h-[90vh] overflow-y-auto">
-          <div className="p-6">
-            <div className="flex justify-between items-start mb-4">
-              <div>
-                <h2 className="text-2xl font-bold">{selectedSubject.name}</h2>
-                <p className="text-gray-600">{selectedSubject.code}</p>
-              </div>
-              <button
-                onClick={closeModal}
-                className="text-gray-400 hover:text-gray-600"
-              >
-                <svg
-                  className="w-6 h-6"
-                  fill="none"
-                  stroke="currentColor"
-                  viewBox="0 0 24 24"
-                  xmlns="http://www.w3.org/2000/svg"
-                >
-                  <path
-                    strokeLinecap="round"
-                    strokeLinejoin="round"
-                    strokeWidth={2}
-                    d="M6 18L18 6M6 6l12 12"
-                  />
-                </svg>
-              </button>
-            </div>
-
-            <div className="mb-4">
-              <span className="inline">
-                <span className="">{abstractText}</span>
-                {canToggle && (
-                  <button
-                    className="text-blue-500 hover:underline ml-1 inline"
-                    onClick={() => setIsExpanded(!isExpanded)}
-                  >
-                    {isExpanded ? "Прочитај помалку" : "Прочитај повеќе"}
-                  </button>
-                )}
-              </span>
-            </div>
-
-            <div className="mb-2">
-              <h3 className="text-lg font-medium">Професори:</h3>
-              <p>
-                {selectedSubject.subject_info.professors.length == 0
-                  ? "Нема одредени професори"
-                  : selectedSubject.subject_info.professors.join(", ")}
-              </p>
-            </div>
-            <div className="mb-4">
-              <h3 className="text-lg font-medium">Асистенти:</h3>
-              <p>
-                {selectedSubject.subject_info.assistants.length == 0
-                  ? "Нема одредени асистенти"
-                  : selectedSubject.subject_info.assistants.join(", ")}
-              </p>
-            </div>
-
-            <div className="bg-gray-50 rounded-lg p-4 mb-3">
-              <h3 className="text-lg font-medium mb-4">
-                Информации за предметот
-              </h3>
-
-              <div className="grid grid-cols-1 md:grid-cols-2 gap-4">
-                <div>
-                  <div className="flex items-center mb-3">
-                    <div>
-                      <p className="text-sm text-gray-500">
-                        Препорачан семестар
-                      </p>
-                      <p className="font-medium">
-                        {selectedSubject.subject_info.semester}
-                      </p>
-                    </div>
-                  </div>
-                  <div className="flex items-center mb-3">
-                    <div>
-                      <p className="text-sm text-gray-500">Зимски / Летен</p>
-                      <p className="font-medium">
-                        {selectedSubject.subject_info.season == "S"
-                          ? "Летен"
-                          : "Зимски"}
-                      </p>
-                    </div>
-                  </div>
-                  <div className="flex items-center mb-3">
-                    <div>
-                      <p className="text-sm text-gray-500">Ниво</p>
-                      <p className="font-medium">
-                        L{selectedSubject.subject_info.level}
-                      </p>
-                    </div>
-                  </div>
-                </div>
-                <div>
-                  <div className="flex items-center mb-3">
-                    <div>
-                      <p className="text-sm text-gray-500">Задолжителен за:</p>
-                      <p className="font-medium">
-                        {selectedSubject.subject_info.mandatory_for.length == 0
-                          ? "Не е задолжителен предмет"
-                          : selectedSubject.subject_info.mandatory_for
-                              .map((s) => s.replace(/\d+$/, ""))
-                              .join(", ")}
-                      </p>
-                    </div>
-                  </div>
-                  <div className="flex items-center mb-3">
-                    <div>
-                      <p className="text-sm text-gray-500">Изборен за:</p>
-                      <p className="font-medium">
-                        {selectedSubject.subject_info.elective_for.length == 0
-                          ? "Не е изборен предмет"
-                          : selectedSubject.subject_info.elective_for
-                              .map((s) => s.replace(/\d+$/, ""))
-                              .join(", ")}
-                      </p>
-                    </div>
-                  </div>
-                  <div className="flex items-center mb-3">
-                    <div>
-                      <p className="text-sm text-gray-500">Предуслови:</p>
-                      <p className="font-medium">
-                        {Array.isArray(subjectPrerequisites)
-                          ? subjectPrerequisites.join(" или ")
-                          : typeof subjectPrerequisites === "number"
-                          ? `${subjectPrerequisites} кредити`
-                          : subjectPrerequisites}
-                      </p>
-                    </div>
-                  </div>
-                </div>
-              </div>
-            </div>
-            <div>
-              {selectedSubject.subject_info.participants[0] == 0 ? (
-                <div className="bg-red-500 py-3 pl-2 rounded-md">
-                  Овој предмет не бил активиран минатиот семестар.
-                </div>
-              ) : (
-                <p>{`Овој предмет минатиот семестар бил запишан од
+	const [isExpanded, setIsExpanded] = useState(false);
+
+	const WORD_LIMIT = 40;
+
+	const truncateText = (text: string) => {
+		if (!text) return "";
+		const words = text.split(/\s+/);
+		console.log(words.slice(0, WORD_LIMIT).join(" ") + "...");
+		return words.length <= WORD_LIMIT
+			? text
+			: words.slice(0, WORD_LIMIT).join(" ") + "...";
+	};
+
+	const canToggle = selectedSubject.abstract.split(/\s+/).length > WORD_LIMIT;
+	const abstractText = isExpanded
+		? selectedSubject.abstract
+		: truncateText(selectedSubject.abstract);
+	return (
+		<>
+			<div className="fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center p-4 z-50">
+				<div className="bg-white rounded-lg shadow-xl max-w-2xl w-full max-h-[90vh] overflow-y-auto">
+					<div className="p-6">
+						<div className="flex justify-between items-start mb-4">
+							<div>
+								<h2 className="text-2xl font-bold">{selectedSubject.name}</h2>
+								<p className="text-gray-600">{selectedSubject.code}</p>
+							</div>
+							<button
+								onClick={closeModal}
+								className="text-gray-400 hover:text-gray-600"
+							>
+								<svg
+									className="w-6 h-6"
+									fill="none"
+									stroke="currentColor"
+									viewBox="0 0 24 24"
+									xmlns="http://www.w3.org/2000/svg"
+								>
+									<path
+										strokeLinecap="round"
+										strokeLinejoin="round"
+										strokeWidth={2}
+										d="M6 18L18 6M6 6l12 12"
+									/>
+								</svg>
+							</button>
+						</div>
+
+						<div className="mb-4">
+							<span className="inline">
+								<span className="">{abstractText}</span>
+								{canToggle && (
+									<button
+										className="text-blue-500 hover:underline ml-1 inline"
+										onClick={() => setIsExpanded(!isExpanded)}
+									>
+										{isExpanded ? "Прочитај помалку" : "Прочитај повеќе"}
+									</button>
+								)}
+							</span>
+						</div>
+
+						<div className="mb-2">
+							<h3 className="text-lg font-medium">Професори:</h3>
+							<p>
+								{selectedSubject.subject_info.professors.length == 0
+									? "Нема одредени професори"
+									: selectedSubject.subject_info.professors.join(", ")}
+							</p>
+						</div>
+						<div className="mb-4">
+							<h3 className="text-lg font-medium">Асистенти:</h3>
+							<p>
+								{selectedSubject.subject_info.assistants.length == 0
+									? "Нема одредени асистенти"
+									: selectedSubject.subject_info.assistants.join(", ")}
+							</p>
+						</div>
+
+						<div className="bg-gray-50 rounded-lg p-4 mb-3">
+							<h3 className="text-lg font-medium mb-4">
+								Информации за предметот
+							</h3>
+
+							<div className="grid grid-cols-1 md:grid-cols-2 gap-4">
+								<div>
+									<div className="flex items-center mb-3">
+										<div>
+											<p className="text-sm text-gray-500">
+												Препорачан семестар
+											</p>
+											<p className="font-medium">
+												{selectedSubject.subject_info.semester}
+											</p>
+										</div>
+									</div>
+									<div className="flex items-center mb-3">
+										<div>
+											<p className="text-sm text-gray-500">Зимски / Летен</p>
+											<p className="font-medium">
+												{selectedSubject.subject_info.season == "S"
+													? "Летен"
+													: "Зимски"}
+											</p>
+										</div>
+									</div>
+									<div className="flex items-center mb-3">
+										<div>
+											<p className="text-sm text-gray-500">Ниво</p>
+											<p className="font-medium">
+												L{selectedSubject.subject_info.level}
+											</p>
+										</div>
+									</div>
+								</div>
+								<div>
+									<div className="flex items-center mb-3">
+										<div>
+											<p className="text-sm text-gray-500">Задолжителен за:</p>
+											<p className="font-medium">
+												{selectedSubject.subject_info.mandatory_for.length == 0
+													? "Не е задолжителен предмет"
+													: selectedSubject.subject_info.mandatory_for
+															.map((s) => s.replace(/\d+$/, ""))
+															.join(", ")}
+											</p>
+										</div>
+									</div>
+									<div className="flex items-center mb-3">
+										<div>
+											<p className="text-sm text-gray-500">Изборен за:</p>
+											<p className="font-medium">
+												{selectedSubject.subject_info.elective_for.length == 0
+													? "Не е изборен предмет"
+													: selectedSubject.subject_info.elective_for
+															.map((s) => s.replace(/\d+$/, ""))
+															.join(", ")}
+											</p>
+										</div>
+									</div>
+									<div className="flex items-center mb-3">
+										<div>
+											<p className="text-sm text-gray-500">Предуслови:</p>
+											<p className="font-medium">
+												{Array.isArray(subjectPrerequisites)
+													? subjectPrerequisites.join(" или ")
+													: typeof subjectPrerequisites === "number"
+													? `${subjectPrerequisites} кредити`
+													: subjectPrerequisites}
+											</p>
+										</div>
+									</div>
+								</div>
+							</div>
+						</div>
+						<div>
+							{selectedSubject.subject_info.participants[0] == 0 ? (
+								<div className="bg-red-500 py-3 pl-2 rounded-md">
+									Овој предмет не бил активиран минатиот семестар.
+								</div>
+							) : (
+								<p>{`Овој предмет минатиот семестар бил запишан од
 									${selectedSubject.subject_info.participants[0]} студенти.`}</p>
-              )}
-            </div>
-            <div className="mt-6">
-              <h3 className="text-lg font-medium mb-2">Тагови</h3>
-              <div className="flex flex-wrap gap-2">
-                {/* TODO: change this when real tags are added in the database*/}
-                {["Web Development", "Machine Learning", "Data Science"].map(
-                  (tag) => (
-                    <span
-                      key={tag}
-                      className="bg-gray-100 text-gray-800 px-3 py-1 rounded-full"
-                    >
-                      {tag}
-                    </span>
-                  )
-                )}
-              </div>
-            </div>
-
-            <div className="mt-8 flex justify-end space-x-3">
-              <button
-                onClick={closeModal}
-                className="px-4 py-2 border border-gray-300 rounded-lg text-gray-700 hover:bg-gray-50"
-              >
-                Затвори
-              </button>
-              {/* <button
+							)}
+						</div>
+						<div className="mt-6">
+							<h3 className="text-lg font-medium mb-2">Тагови</h3>
+							<div className="flex flex-wrap gap-2">
+								{selectedSubject.subject_info.tags.map((tag) => (
+									<span
+										key={tag}
+										className="bg-gray-100 text-gray-800 px-3 py-1 rounded-full"
+									>
+										{tag}
+									</span>
+								))}
+							</div>
+						</div>
+
+						<div className="mt-8 flex justify-end space-x-3">
+							<button
+								onClick={closeModal}
+								className="px-4 py-2 border border-gray-300 rounded-lg text-gray-700 hover:bg-gray-50"
+							>
+								Затвори
+							</button>
+							{/* <button
 									onClick={closeModal}
 									className="px-4 py-2 bg-blue-600 text-white rounded-lg hover:bg-blue-700"
@@ -208,10 +205,10 @@
 									Погледни детали
 								</button> */}
-            </div>
-          </div>
-        </div>
-      </div>
-    </>
-  );
+						</div>
+					</div>
+				</div>
+			</div>
+		</>
+	);
 }
 export default SubjectModal;
