Skip to content

Commit 1080be7

Browse files
committed
Merge branch 'dev' into deo/onboarding
2 parents 09b5199 + 3209a74 commit 1080be7

12 files changed

Lines changed: 294 additions & 180 deletions

File tree

‎apps/codebility/app/home/in-house/_components/shared/ProjectSelect.tsx‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ export function ProjectSelect({
6666
<div className="space-y-2">
6767
{/* Dropdown for selecting more projects */}
6868
<Select onValueChange={handleProjectChange} disabled={disabled}>
69-
<SelectTrigger className="border-light-700 dark:border-dark-200 bg-light-800 dark:bg-dark-200 w-full">
69+
<SelectTrigger className="border-light-700 dark:border-dark-200 bg-light-800 dark:bg-dark-200 dark:text-light-900 w-full text-black">
7070
<SelectValue placeholder="Select a project" />
7171
</SelectTrigger>
7272
<SelectContent className="bg-light-800 dark:bg-dark-200">

‎apps/codebility/app/home/in-house/_components/table/MobileEditableForm.tsx‎

Lines changed: 52 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -223,8 +223,12 @@ export function MobileEditableForm({
223223
)}
224224
</div>
225225
<div>
226-
<h3 className="text-sm font-semibold dark:text-white">Edit Member</h3>
227-
<p className="text-xs text-gray-600 dark:text-gray-400">Update information</p>
226+
<h3 className="text-sm font-semibold dark:text-white">
227+
Edit Member
228+
</h3>
229+
<p className="text-xs text-gray-600 dark:text-gray-400">
230+
Update information
231+
</p>
228232
</div>
229233
</div>
230234
<div className="flex gap-2">
@@ -253,48 +257,56 @@ export function MobileEditableForm({
253257
{/* Name fields */}
254258
<div className="grid grid-cols-2 gap-2">
255259
<div>
256-
<label className="mb-1 block text-xs text-gray-600 dark:text-gray-400">First Name</label>
260+
<label className="mb-1 block text-xs text-gray-600 dark:text-gray-400">
261+
First Name
262+
</label>
257263
<Input
258264
value={editForm.first_name || ""}
259265
onChange={(e) => handleLocalChange("first_name", e.target.value)}
260266
disabled={isSubmitting || isUploading}
261-
className="h-8 text-sm"
267+
className="h-8 text-sm dark:text-white"
262268
/>
263269
</div>
264270
<div>
265-
<label className="mb-1 block text-xs text-gray-600 dark:text-gray-400">Last Name</label>
271+
<label className="mb-1 block text-xs text-gray-600 dark:text-gray-400">
272+
Last Name
273+
</label>
266274
<Input
267275
value={editForm.last_name || ""}
268276
onChange={(e) => handleLocalChange("last_name", e.target.value)}
269277
disabled={isSubmitting || isUploading}
270-
className="h-8 text-sm"
278+
className="h-8 text-sm dark:text-white"
271279
/>
272280
</div>
273281
</div>
274282

275283
{/* Email */}
276284
<div>
277-
<label className="mb-1 block text-xs text-gray-600 dark:text-gray-400">Email</label>
285+
<label className="mb-1 block text-xs text-gray-600 dark:text-gray-400">
286+
Email
287+
</label>
278288
<Input
279289
value={editForm.email_address || ""}
280290
onChange={(e) => handleLocalChange("email_address", e.target.value)}
281291
disabled={isSubmitting || isUploading}
282-
className="h-8 text-sm"
292+
className="h-8 text-sm dark:text-white"
283293
/>
284294
</div>
285295

286296
{/* Status and Role */}
287297
<div className="grid grid-cols-2 gap-2">
288298
<div>
289-
<label className="mb-1 block text-xs text-gray-600 dark:text-gray-400">Status</label>
299+
<label className="mb-1 block text-xs text-gray-600 dark:text-gray-400">
300+
Status
301+
</label>
290302
<Select
291303
value={editForm.internal_status || undefined}
292304
onValueChange={(value: InternalStatus) =>
293305
handleLocalChange("internal_status", value)
294306
}
295307
disabled={isSubmitting || isUploading}
296308
>
297-
<SelectTrigger className="h-8 text-sm">
309+
<SelectTrigger className="h-8 text-sm text-gray-900 dark:text-white">
298310
<SelectValue placeholder="Select status" />
299311
</SelectTrigger>
300312
<SelectContent>
@@ -307,15 +319,17 @@ export function MobileEditableForm({
307319
</Select>
308320
</div>
309321
<div>
310-
<label className="mb-1 block text-xs text-gray-600 dark:text-gray-400">Role</label>
322+
<label className="mb-1 block text-xs text-gray-600 dark:text-gray-400">
323+
Role
324+
</label>
311325
<Select
312326
value={String(editForm.role_id || "")}
313327
onValueChange={(value) =>
314328
handleLocalChange("role_id", parseInt(value))
315329
}
316330
disabled={isSubmitting || isUploading}
317331
>
318-
<SelectTrigger className="h-8 text-sm">
332+
<SelectTrigger className="h-8 text-sm text-gray-900 dark:text-white">
319333
<SelectValue placeholder="Select role" />
320334
</SelectTrigger>
321335
<SelectContent>
@@ -331,15 +345,17 @@ export function MobileEditableForm({
331345

332346
{/* Position */}
333347
<div>
334-
<label className="mb-1 block text-xs text-gray-600 dark:text-gray-400">Position</label>
348+
<label className="mb-1 block text-xs text-gray-600 dark:text-gray-400">
349+
Position
350+
</label>
335351
<Select
336352
value={editForm.display_position || ""}
337353
onValueChange={(value) =>
338354
handleLocalChange("display_position", value)
339355
}
340356
disabled={isSubmitting || isUploading}
341357
>
342-
<SelectTrigger className="h-8 text-sm">
358+
<SelectTrigger className="h-8 text-sm text-gray-900 dark:text-white">
343359
<SelectValue placeholder="Select position" />
344360
</SelectTrigger>
345361
<SelectContent>
@@ -354,7 +370,9 @@ export function MobileEditableForm({
354370

355371
{/* Projects */}
356372
<div>
357-
<label className="mb-1 block text-xs text-gray-600 dark:text-gray-400">Projects</label>
373+
<label className="mb-1 block text-xs text-gray-600 dark:text-gray-400">
374+
Projects
375+
</label>
358376
<ProjectSelect
359377
value={editForm.projects || []}
360378
onChange={(projects) => handleLocalChange("projects", projects)}
@@ -365,15 +383,17 @@ export function MobileEditableForm({
365383
{/* NDA Status and Availability */}
366384
<div className="grid grid-cols-2 gap-2">
367385
<div>
368-
<label className="mb-1 block text-xs text-gray-600 dark:text-gray-400">NDA Status</label>
386+
<label className="mb-1 block text-xs text-gray-600 dark:text-gray-400">
387+
NDA Status
388+
</label>
369389
<Select
370390
value={editForm.nda_status ? "Yes" : "No"}
371391
onValueChange={(value) =>
372392
handleLocalChange("nda_status", value === "Yes")
373393
}
374394
disabled={isSubmitting || isUploading}
375395
>
376-
<SelectTrigger className="h-8 text-sm">
396+
<SelectTrigger className="h-8 text-sm text-gray-900 dark:text-white">
377397
<SelectValue placeholder="Select NDA status" />
378398
</SelectTrigger>
379399
<SelectContent>
@@ -383,7 +403,9 @@ export function MobileEditableForm({
383403
</Select>
384404
</div>
385405
<div>
386-
<label className="mb-1 block text-xs text-gray-600 dark:text-gray-400">Available</label>
406+
<label className="mb-1 block text-xs text-gray-600 dark:text-gray-400">
407+
Available
408+
</label>
387409
<div className="mt-1">
388410
<SwitchStatusButton
389411
isActive={editForm.availability_status ?? false}
@@ -401,19 +423,25 @@ export function MobileEditableForm({
401423

402424
{/* Portfolio */}
403425
<div>
404-
<label className="mb-1 block text-xs text-gray-600 dark:text-gray-400">Portfolio</label>
426+
<label className="mb-1 block text-xs text-gray-600 dark:text-gray-400">
427+
Portfolio
428+
</label>
405429
<Input
406430
value={editForm.portfolio_website || ""}
407-
onChange={(e) => handleLocalChange("portfolio_website", e.target.value)}
431+
onChange={(e) =>
432+
handleLocalChange("portfolio_website", e.target.value)
433+
}
408434
disabled={isSubmitting || isUploading}
409435
placeholder="https://..."
410-
className="h-8 text-sm"
436+
className="h-8 text-sm text-gray-900 dark:text-white"
411437
/>
412438
</div>
413439

414440
{/* Date Joined */}
415441
<div>
416-
<label className="mb-1 block text-xs text-gray-600 dark:text-gray-400">Date Joined</label>
442+
<label className="mb-1 block text-xs text-gray-600 dark:text-gray-400">
443+
Date Joined
444+
</label>
417445
<Input
418446
type="date"
419447
value={
@@ -428,10 +456,10 @@ export function MobileEditableForm({
428456
handleLocalChange("date_joined", dateValue);
429457
}}
430458
disabled={isSubmitting || isUploading}
431-
className="h-8 text-sm"
459+
className="h-8 text-sm text-gray-900 dark:text-white"
432460
/>
433461
</div>
434462
</div>
435463
</div>
436464
);
437-
}
465+
}

‎apps/codebility/app/home/kanban/[projectId]/[id]/_components/KanbanBoardColumnContainer.tsx‎

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import { useCallback, useEffect, useMemo, useState } from "react";
44
import { useRouter } from "next/navigation";
5+
import { useKanbanStore } from "@/store/kanban-store";
56
import { KanbanColumnType, Task } from "@/types/home/codev";
67
import { debounce } from "@/utils/debounce";
78
import {
@@ -88,7 +89,7 @@ export default function KanbanBoardColumnContainer({
8889
const [pendingUpdates, setPendingUpdates] = useState<
8990
Array<{ taskId: string; newColumnId: string }>
9091
>([]);
91-
92+
9293
// Track dragging state for immediate feedback
9394
const [isDragging, setIsDragging] = useState(false);
9495

@@ -163,7 +164,6 @@ export default function KanbanBoardColumnContainer({
163164
);
164165
}, [orderedColumns, activeFilter, filterAndSortTasks]);
165166

166-
167167
const handleDragStart = useCallback((event: DragStartEvent) => {
168168
// Optional: set active item state for custom drag overlays.
169169
}, []);
@@ -264,8 +264,13 @@ export default function KanbanBoardColumnContainer({
264264
// Add to pending updates for debounced batch processing
265265
setPendingUpdates((prev) => {
266266
// Remove any existing update for this task to avoid duplicates
267-
const filtered = prev.filter(update => update.taskId !== movedTask.id);
268-
return [...filtered, { taskId: movedTask.id, newColumnId: overColId }];
267+
const filtered = prev.filter(
268+
(update) => update.taskId !== movedTask.id,
269+
);
270+
return [
271+
...filtered,
272+
{ taskId: movedTask.id, newColumnId: overColId },
273+
];
269274
});
270275
}
271276
},

‎apps/codebility/app/home/kanban/[projectId]/[id]/_components/KanbanColumn.tsx‎

Lines changed: 23 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
"use client";
22

33
import { useMemo, useState } from "react";
4-
import { useRouter } from "next/navigation";
54
import { Button } from "@/components/ui/button";
65
import { useModal } from "@/hooks/use-modal";
76
import { useUserStore } from "@/store/codev-store";
7+
import { useKanbanStore } from "@/store/kanban-store";
88
import { ExtendedTask } from "@/types/home/codev";
99
import { useDroppable } from "@dnd-kit/core";
1010
import {
@@ -52,13 +52,18 @@ export default function KanbanColumn({
5252
tasks,
5353
onTaskComplete,
5454
}: Props) {
55-
const router = useRouter();
5655
const { user } = useUserStore();
5756
const canModifyColumn = user?.role_id === 1 || user?.role_id === 5;
58-
const canAddTask = user?.role_id === 1 || user?.role_id === 5 || user?.role_id === 4 || user?.role_id === 10;
57+
const canAddTask =
58+
user?.role_id === 1 ||
59+
user?.role_id === 5 ||
60+
user?.role_id === 4 ||
61+
user?.role_id === 10;
5962
const [isEditing, setIsEditing] = useState(false);
6063
const [newName, setNewName] = useState(column.name);
6164

65+
const { fetchBoardData } = useKanbanStore();
66+
6267
const safeTasks = tasks ?? [];
6368

6469
// 1) Make the whole column "sortable" so we can reorder columns horizontally
@@ -115,7 +120,8 @@ export default function KanbanColumn({
115120
const response = await deleteColumn(column.id);
116121
if (response.success) {
117122
toast.success("Column deleted successfully");
118-
window.location.reload();
123+
// Refetch the board data
124+
await fetchBoardData();
119125
} else {
120126
toast.error(response.error || "Failed to delete column");
121127
}
@@ -126,15 +132,14 @@ export default function KanbanColumn({
126132
toast.error("You don't have permission to delete columns");
127133
return;
128134
}
129-
135+
130136
if (safeTasks.length > 0) {
131137
toast.error("Cannot delete column with tasks");
132138
return;
133139
}
134-
140+
135141
onOpen("deleteWarningModal", {}, {}, () => confirmDelete());
136142
};
137-
138143

139144
// Handle column rename
140145
const handleUpdateName = async () => {
@@ -152,7 +157,8 @@ export default function KanbanColumn({
152157
if (response.success) {
153158
toast.success("Column name updated");
154159
setIsEditing(false);
155-
router.refresh();
160+
// Refetch the board data
161+
await fetchBoardData();
156162
} else {
157163
toast.error(response.error || "Failed to update column name");
158164
}
@@ -171,18 +177,18 @@ export default function KanbanColumn({
171177
lg:w-[400px] lg:min-w-[400px]
172178
${
173179
isColumnDragging
174-
? "border-customBlue-500 opacity-95 shadow-lg shadow-customBlue-500/15 scale-[1.02]"
180+
? "border-customBlue-500 shadow-customBlue-500/15 scale-[1.02] opacity-95 shadow-lg"
175181
: isOver
176182
? "border-customBlue-400 bg-customBlue-50/50 dark:border-customBlue-500 dark:bg-customBlue-950/20"
177-
: "border-gray-300 dark:border-gray-600 shadow-sm hover:shadow-md"
183+
: "border-gray-300 shadow-sm hover:shadow-md dark:border-gray-600"
178184
}
179185
bg-gray-50/90 backdrop-blur-sm transition-all duration-200 ease-out dark:bg-gray-800/90
180186
`}
181187
{...attributes}
182188
>
183189
{/* Column Header */}
184190
<div
185-
className="flex items-center justify-between bg-gradient-to-r from-gray-100 to-gray-200 dark:from-gray-700 dark:to-gray-800 p-3 md:p-4 border-b border-gray-300 dark:border-gray-600"
191+
className="flex items-center justify-between border-b border-gray-300 bg-gradient-to-r from-gray-100 to-gray-200 p-3 dark:border-gray-600 dark:from-gray-700 dark:to-gray-800 md:p-4"
186192
{...listeners}
187193
>
188194
<div className="flex items-center gap-2 text-gray-800 dark:text-gray-200 md:gap-3">
@@ -213,9 +219,11 @@ export default function KanbanColumn({
213219
</div>
214220
) : (
215221
<>
216-
<GripVertical className="hidden h-5 w-5 text-gray-400 cursor-grab hover:text-gray-600 dark:hover:text-gray-300 md:block transition-colors" />
217-
<span className="text-base font-semibold text-gray-900 dark:text-white md:text-lg">{column.name}</span>
218-
<div className="flex items-center justify-center rounded-full bg-customBlue-100 dark:bg-customBlue-900/30 px-3 py-1 text-sm font-medium text-blue-100 dark:text-customBlue-100">
222+
<GripVertical className="hidden h-5 w-5 cursor-grab text-gray-400 transition-colors hover:text-gray-600 dark:hover:text-gray-300 md:block" />
223+
<span className="text-base font-semibold text-gray-900 dark:text-white md:text-lg">
224+
{column.name}
225+
</span>
226+
<div className="bg-customBlue-100 dark:bg-customBlue-900/30 dark:text-customBlue-100 flex items-center justify-center rounded-full px-3 py-1 text-sm font-medium text-blue-100">
219227
{safeTasks.length}
220228
</div>
221229
</>
@@ -261,7 +269,7 @@ export default function KanbanColumn({
261269
className={`
262270
flex min-h-[100px] flex-col gap-2 rounded-md p-1 transition-colors duration-200
263271
md:gap-4 md:p-2
264-
${isOver ? "border-2 border-customBlue-200 bg-customBlue-50 dark:bg-customBlue-900/20" : ""}
272+
${isOver ? "border-customBlue-200 bg-customBlue-50 dark:bg-customBlue-900/20 border-2" : ""}
265273
`}
266274
>
267275
<SortableContext

‎apps/codebility/app/home/kanban/[projectId]/[id]/_components/kanban_modals/KanbanColumnAddModal.tsx‎

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import {
1212
DialogTitle,
1313
} from "@/components/ui/dialog";
1414
import { useModal } from "@/hooks/use-modal";
15+
import { useKanbanStore } from "@/store/kanban-store";
1516
import toast from "react-hot-toast";
1617

1718
import { Input } from "@codevs/ui/input";
@@ -22,6 +23,7 @@ export default function KanbanColumnAddModal() {
2223
const [isLoading, setIsLoading] = useState(false);
2324
const router = useRouter();
2425
const isModalOpen = isOpen && type === "ColumnAddModal";
26+
const { fetchBoardData } = useKanbanStore();
2527

2628
const validateColumnName = (name: string): boolean => {
2729
// Add validation rules based on your database constraints
@@ -46,7 +48,9 @@ export default function KanbanColumnAddModal() {
4648
const response = await createNewColumn(columnName, boardId);
4749
if (response.success) {
4850
toast.success("Column created successfully!");
49-
window.location.reload();
51+
// Refetch the board data
52+
await fetchBoardData();
53+
// window.location.reload();
5054
onClose();
5155
setColumnName("");
5256
} else {

0 commit comments

Comments
 (0)