Skip to content

Commit 4d1d2e0

Browse files
Merge pull request #192 from harshitap1305/feat-bug/skills
[SPRINT M25] add user skill issue resolved
2 parents 5563085 + d25863f commit 4d1d2e0

File tree

5 files changed

+41
-58
lines changed

5 files changed

+41
-58
lines changed

frontend/src/Components/Skills/FilterDropdown.jsx

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,16 +12,23 @@ const FilterDropdown = ({ label, value, onChange, options }) => (
1212
onChange={(e) => onChange(e.target.value)}
1313
className="w-full pl-3 pr-10 py-2 border border-[#DCD3C9] rounded-lg focus:ring-2 focus:ring-black focus:border-black appearance-none bg-white text-black"
1414
>
15-
<option>All</option>
16-
{options.map((opt) => (
17-
<option key={opt} value={opt}>
18-
{opt.charAt(0).toUpperCase() + opt.slice(1)}
19-
</option>
20-
))}
15+
<option value="">Select...</option>
16+
{options.map((opt, idx) => {
17+
// Handle both string and object types
18+
const labelText = typeof opt === "string" ? opt : opt.label;
19+
const valueText = typeof opt === "string" ? opt : opt.value;
20+
return (
21+
<option key={idx} value={valueText}>
22+
{labelText
23+
? labelText.charAt(0).toUpperCase() + labelText.slice(1)
24+
: ""}
25+
</option>
26+
);
27+
})}
2128
</select>
2229
<ChevronDown className="absolute right-3 top-1/2 transform -translate-y-1/2 text-black w-4 h-4 pointer-events-none" />
2330
</div>
2431
</div>
2532
);
2633

27-
export default FilterDropdown;
34+
export default FilterDropdown;

frontend/src/Components/Skills/SkillFormModal.jsx

Lines changed: 27 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import React, { useContext, useEffect, useMemo } from "react";
2-
import { X, ChevronDown, Trophy } from "lucide-react";
1+
import React, { useContext, useMemo } from "react";
2+
import { Trophy } from "lucide-react";
33
import { useSkillForm, useSkills } from "../../hooks/useSkills";
44
import FilterDropdown from "./FilterDropdown";
55
import { usePositionHolders } from "../../hooks/usePositionHolders";
@@ -13,13 +13,9 @@ const SkillFormModal = ({ showForm, setShowForm }) => {
1313
const { positionHolders } = usePositionHolders();
1414
const {
1515
formData,
16-
newSkillData,
1716
loading,
18-
showNewSkillForm,
1917
handleSkillChange,
2018
updateFormData,
21-
updateNewSkillData,
22-
resetForm,
2319
submitSkill,
2420
} = useSkillForm(refreshUserSkills);
2521

@@ -57,25 +53,35 @@ const SkillFormModal = ({ showForm, setShowForm }) => {
5753
<FilterDropdown
5854
label="Select Skill"
5955
value={formData.skill_id}
60-
onChange={handleSkillChange}
61-
options={skills.map((skill) => skill.name + " - " + skill.category)}
56+
onChange={(id) => handleSkillChange(id)}
57+
options={skills.map((skill) => ({
58+
label: `${skill.name} - ${skill.category}`,
59+
value: skill._id,
60+
}))}
6261
/>
6362

6463
<FilterDropdown
65-
label="Proficiency Level"
66-
value={formData.proficiency_level}
67-
onChange={updateFormData}
68-
options={["Beginner", "Intermediate", "Advanced", "Expert"]}
69-
/>
64+
label="Proficiency Level"
65+
value={formData.proficiency_level}
66+
onChange={(val) => updateFormData({ proficiency_level: val })}
67+
options={[
68+
{ label: "Beginner", value: "beginner" },
69+
{ label: "Intermediate", value: "intermediate" },
70+
{ label: "Advanced", value: "advanced" },
71+
{ label: "Expert", value: "expert" },
72+
]}
73+
/>
74+
75+
<FilterDropdown
76+
label="Associated Position (Optional)"
77+
value={formData.position_id}
78+
onChange={(val) => updateFormData({ position_id: val })}
79+
options={userPositions.map((pos) => ({
80+
label: `${pos.title} - ${pos.unit_id?.name || "No Unit"}`,
81+
value: pos._id,
82+
}))}
83+
/>
7084

71-
<FilterDropdown
72-
label="Associated Position (Optional)"
73-
value={formData.position_id}
74-
onChange={updateFormData}
75-
options={userPositions.map(
76-
(pos) => `${pos.title} - ${pos.unit_id?.name || "No Unit"}`
77-
)}
78-
/>
7985
</div>
8086
<div className="pt-4">
8187
<button

frontend/src/Components/Skills/SkillManagement.jsx

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,6 @@
1-
import React, { useState } from "react";
2-
import { Plus } from "lucide-react";
31
import { useSkills, useSkillForm } from "../../hooks/useSkills";
42
import FilterDropdown from "./FilterDropdown";
53
import SkillCard from "./SkillCard";
6-
import SkillFormModal from "./SkillFormModal";
74
import { EmptyStateNoSkills, EmptyStateNoResults } from "./EmptyState";
85

96
const SkillManagement = ({ showForm, setShowForm }) => {
@@ -56,7 +53,6 @@ const SkillManagement = ({ showForm, setShowForm }) => {
5653
{filteredSkills.map((userSkill) => (
5754
<>
5855
<SkillCard key={userSkill._id} userSkill={userSkill} />
59-
{/* <SkillCard key={userSkill._id} userSkill={userSkill} /> */}
6056
</>
6157
))}
6258
</div>

frontend/src/Components/Skills/Skills.jsx

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,10 @@
11
import React, { useContext, useState } from "react";
22
import { AdminContext } from "../../context/AdminContext";
33
import { Eye, Plus } from "lucide-react";
4-
import SkillsEndorsementTab from "../GenSec/SkillsEndorsementTab";
54
import SkillManagement from "./SkillManagement";
6-
import UserSkillsEndorsementTab from "../GenSec/UserSkillsEndorsementTab";
75
import SkillFormModal from "./SkillFormModal";
86

97
const Skills = () => {
10-
const [add, setAdd] = useState(false);
11-
const { isUserLoggedIn } = useContext(AdminContext);
12-
const userRole = isUserLoggedIn?.role || "STUDENT";
138
const [showForm, setShowForm] = useState(false);
149

1510
return (

frontend/src/hooks/useSkills.js

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -186,30 +186,9 @@ export const useSkillForm = (onSuccess) => {
186186
if (!formData.skill_id) {
187187
return { success: false, message: "Please select a skill." };
188188
}
189-
190-
if (
191-
showNewSkillForm &&
192-
(!newSkillData.name.trim() || !newSkillData.category.trim())
193-
) {
194-
return {
195-
success: false,
196-
message: "Please fill all required fields for the new skill.",
197-
};
198-
}
199-
200189
setLoading(true);
201190
try {
202191
let skillIdToUse = formData.skill_id;
203-
204-
// Create new skill if needed
205-
if (showNewSkillForm) {
206-
const newSkillResponse = await api.post(
207-
`/api/skills/create-skill`,
208-
newSkillData
209-
);
210-
skillIdToUse = newSkillResponse.data._id;
211-
}
212-
213192
// Create user skill
214193
await api.post(`/api/skills/create-user-skill`, {
215194
user_id: isUserLoggedIn._id,

0 commit comments

Comments
 (0)