Spaces:
Running
Running
User commited on
Commit ·
0309c19
1
Parent(s): 72f2be7
add: adjust UI
Browse files
TaskTrackingSystem.WebApp/Components/Pages/Home.razor
CHANGED
|
@@ -224,7 +224,7 @@ else
|
|
| 224 |
@foreach (var task in ChecklistTasks)
|
| 225 |
{
|
| 226 |
<div class="flex items-start gap-3 p-2 rounded-lg hover:bg-slate-50 transition-colors">
|
| 227 |
-
<input type="checkbox" checked="@(task.StatusId == 3)" @onchange="() => ToggleTaskStatus(task)" class="h-4 w-4 rounded border-slate-300 text-emerald-600 accent-emerald-600 mt-0.5" />
|
| 228 |
<div class="min-w-0 flex-1">
|
| 229 |
<p class="text-xs font-semibold text-slate-800 truncate @(task.StatusId == 3 ? "line-through text-slate-400" : "")">@task.Title</p>
|
| 230 |
<p class="text-[10px] text-slate-400">Due @task.DueDate.ToString("dd-MMM-yyyy")</p>
|
|
@@ -277,11 +277,13 @@ else
|
|
| 277 |
private string currentUserRole = "Member";
|
| 278 |
private List<DateTime> weekDates = new();
|
| 279 |
private bool canCreateTask = false;
|
|
|
|
| 280 |
|
| 281 |
protected override async Task OnInitializedAsync()
|
| 282 |
{
|
| 283 |
var authState = await AuthStateProvider.GetAuthenticationStateAsync();
|
| 284 |
canCreateTask = authState.User.IsInRole("Admin") || await MenuAuthorization.HasAccessCodeAsync(authState.User, "Tasks_Create");
|
|
|
|
| 285 |
await LoadDashboardData();
|
| 286 |
}
|
| 287 |
|
|
@@ -376,6 +378,11 @@ else
|
|
| 376 |
|
| 377 |
private async Task ToggleTaskStatus(TaskDto task)
|
| 378 |
{
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 379 |
var newStatusId = task.StatusId == 3 ? 1 : 3;
|
| 380 |
var client = ApiClient.CreateClient();
|
| 381 |
try
|
|
|
|
| 224 |
@foreach (var task in ChecklistTasks)
|
| 225 |
{
|
| 226 |
<div class="flex items-start gap-3 p-2 rounded-lg hover:bg-slate-50 transition-colors">
|
| 227 |
+
<input type="checkbox" checked="@(task.StatusId == 3)" @onchange="() => ToggleTaskStatus(task)" disabled="@(!canUpdateTask)" class="h-4 w-4 rounded border-slate-300 text-emerald-600 accent-emerald-600 mt-0.5 disabled:opacity-50 disabled:cursor-not-allowed" />
|
| 228 |
<div class="min-w-0 flex-1">
|
| 229 |
<p class="text-xs font-semibold text-slate-800 truncate @(task.StatusId == 3 ? "line-through text-slate-400" : "")">@task.Title</p>
|
| 230 |
<p class="text-[10px] text-slate-400">Due @task.DueDate.ToString("dd-MMM-yyyy")</p>
|
|
|
|
| 277 |
private string currentUserRole = "Member";
|
| 278 |
private List<DateTime> weekDates = new();
|
| 279 |
private bool canCreateTask = false;
|
| 280 |
+
private bool canUpdateTask = false;
|
| 281 |
|
| 282 |
protected override async Task OnInitializedAsync()
|
| 283 |
{
|
| 284 |
var authState = await AuthStateProvider.GetAuthenticationStateAsync();
|
| 285 |
canCreateTask = authState.User.IsInRole("Admin") || await MenuAuthorization.HasAccessCodeAsync(authState.User, "Tasks_Create");
|
| 286 |
+
canUpdateTask = authState.User.IsInRole("Admin") || await MenuAuthorization.HasAccessCodeAsync(authState.User, "Tasks_Update");
|
| 287 |
await LoadDashboardData();
|
| 288 |
}
|
| 289 |
|
|
|
|
| 378 |
|
| 379 |
private async Task ToggleTaskStatus(TaskDto task)
|
| 380 |
{
|
| 381 |
+
if (!canUpdateTask)
|
| 382 |
+
{
|
| 383 |
+
return;
|
| 384 |
+
}
|
| 385 |
+
|
| 386 |
var newStatusId = task.StatusId == 3 ? 1 : 3;
|
| 387 |
var client = ApiClient.CreateClient();
|
| 388 |
try
|
TaskTrackingSystem.WebApp/Components/Pages/KanbanBoard.razor
CHANGED
|
@@ -72,8 +72,8 @@
|
|
| 72 |
{
|
| 73 |
@foreach (var task in tasksInColumn)
|
| 74 |
{
|
| 75 |
-
<div class="rounded-lg border border-slate-200 bg-white p-4 shadow-sm hover:shadow-md transition-shadow cursor-grab active:cursor-grabbing"
|
| 76 |
-
draggable="
|
| 77 |
@ondragstart="() => HandleDragStart(task)">
|
| 78 |
<div class="flex items-start justify-between">
|
| 79 |
<h4 class="text-sm font-semibold text-slate-900">@task.Title</h4>
|
|
@@ -173,6 +173,7 @@
|
|
| 173 |
private bool isAdmin = false;
|
| 174 |
private bool isManager = false;
|
| 175 |
private bool canCreateTask = false;
|
|
|
|
| 176 |
private long currentUserId = 0;
|
| 177 |
private bool showTaskModal = false;
|
| 178 |
private bool isSaving = false;
|
|
@@ -232,6 +233,7 @@
|
|
| 232 |
isAdmin = user.IsInRole("Admin");
|
| 233 |
isManager = user.IsInRole("Manager");
|
| 234 |
canCreateTask = isAdmin || await MenuAuthorization.HasAccessCodeAsync(user, "Tasks_Create");
|
|
|
|
| 235 |
await LoadTasks();
|
| 236 |
}
|
| 237 |
|
|
@@ -283,6 +285,11 @@
|
|
| 283 |
|
| 284 |
private async Task MoveTask(long taskId, long newStatusId)
|
| 285 |
{
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 286 |
var client = ApiClient.CreateClient();
|
| 287 |
try
|
| 288 |
{
|
|
|
|
| 72 |
{
|
| 73 |
@foreach (var task in tasksInColumn)
|
| 74 |
{
|
| 75 |
+
<div class="rounded-lg border border-slate-200 bg-white p-4 shadow-sm hover:shadow-md transition-shadow @(canUpdateTask ? "cursor-grab active:cursor-grabbing" : "cursor-default")"
|
| 76 |
+
draggable="@canUpdateTask"
|
| 77 |
@ondragstart="() => HandleDragStart(task)">
|
| 78 |
<div class="flex items-start justify-between">
|
| 79 |
<h4 class="text-sm font-semibold text-slate-900">@task.Title</h4>
|
|
|
|
| 173 |
private bool isAdmin = false;
|
| 174 |
private bool isManager = false;
|
| 175 |
private bool canCreateTask = false;
|
| 176 |
+
private bool canUpdateTask = false;
|
| 177 |
private long currentUserId = 0;
|
| 178 |
private bool showTaskModal = false;
|
| 179 |
private bool isSaving = false;
|
|
|
|
| 233 |
isAdmin = user.IsInRole("Admin");
|
| 234 |
isManager = user.IsInRole("Manager");
|
| 235 |
canCreateTask = isAdmin || await MenuAuthorization.HasAccessCodeAsync(user, "Tasks_Create");
|
| 236 |
+
canUpdateTask = isAdmin || await MenuAuthorization.HasAccessCodeAsync(user, "Tasks_Update");
|
| 237 |
await LoadTasks();
|
| 238 |
}
|
| 239 |
|
|
|
|
| 285 |
|
| 286 |
private async Task MoveTask(long taskId, long newStatusId)
|
| 287 |
{
|
| 288 |
+
if (!canUpdateTask)
|
| 289 |
+
{
|
| 290 |
+
return;
|
| 291 |
+
}
|
| 292 |
+
|
| 293 |
var client = ApiClient.CreateClient();
|
| 294 |
try
|
| 295 |
{
|
TaskTrackingSystem.WebApp/Components/Pages/OverdueTasksReport.razor
CHANGED
|
@@ -8,6 +8,8 @@
|
|
| 8 |
@attribute [Authorize]
|
| 9 |
@inject ApiClientService ApiClient
|
| 10 |
@inject IJSRuntime JS
|
|
|
|
|
|
|
| 11 |
|
| 12 |
<PageTitle>Overdue & Delayed Tasks Report</PageTitle>
|
| 13 |
|
|
@@ -221,9 +223,12 @@
|
|
| 221 |
<button @onclick="() => RemindAssignee(task)" class="text-xs font-semibold text-violet-600 hover:text-violet-900 transition-colors font-sans">
|
| 222 |
Remind
|
| 223 |
</button>
|
| 224 |
-
|
| 225 |
-
|
| 226 |
-
|
|
|
|
|
|
|
|
|
|
| 227 |
</td>
|
| 228 |
</tr>
|
| 229 |
}
|
|
@@ -304,6 +309,7 @@
|
|
| 304 |
private int criticalCount = 0;
|
| 305 |
private int dueSoonCount = 0;
|
| 306 |
private int avgDaysOverdue = 0;
|
|
|
|
| 307 |
|
| 308 |
private IEnumerable<TaskDto> FilteredTasks
|
| 309 |
{
|
|
@@ -347,6 +353,8 @@
|
|
| 347 |
|
| 348 |
protected override async Task OnInitializedAsync()
|
| 349 |
{
|
|
|
|
|
|
|
| 350 |
var client = ApiClient.CreateClient();
|
| 351 |
try
|
| 352 |
{
|
|
@@ -453,6 +461,11 @@
|
|
| 453 |
|
| 454 |
private async Task SaveDueDateAdjustment()
|
| 455 |
{
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 456 |
if (selectedTaskForAdjustment == null) return;
|
| 457 |
|
| 458 |
isAdjusting = true;
|
|
|
|
| 8 |
@attribute [Authorize]
|
| 9 |
@inject ApiClientService ApiClient
|
| 10 |
@inject IJSRuntime JS
|
| 11 |
+
@inject AuthenticationStateProvider AuthStateProvider
|
| 12 |
+
@inject MenuAuthorizationService MenuAuthorization
|
| 13 |
|
| 14 |
<PageTitle>Overdue & Delayed Tasks Report</PageTitle>
|
| 15 |
|
|
|
|
| 223 |
<button @onclick="() => RemindAssignee(task)" class="text-xs font-semibold text-violet-600 hover:text-violet-900 transition-colors font-sans">
|
| 224 |
Remind
|
| 225 |
</button>
|
| 226 |
+
@if (canUpdateTask)
|
| 227 |
+
{
|
| 228 |
+
<button @onclick="() => OpenAdjustDueDateModal(task)" class="text-xs font-semibold text-slate-600 hover:text-slate-900 transition-colors font-sans">
|
| 229 |
+
Adjust Due Date
|
| 230 |
+
</button>
|
| 231 |
+
}
|
| 232 |
</td>
|
| 233 |
</tr>
|
| 234 |
}
|
|
|
|
| 309 |
private int criticalCount = 0;
|
| 310 |
private int dueSoonCount = 0;
|
| 311 |
private int avgDaysOverdue = 0;
|
| 312 |
+
private bool canUpdateTask = false;
|
| 313 |
|
| 314 |
private IEnumerable<TaskDto> FilteredTasks
|
| 315 |
{
|
|
|
|
| 353 |
|
| 354 |
protected override async Task OnInitializedAsync()
|
| 355 |
{
|
| 356 |
+
var authState = await AuthStateProvider.GetAuthenticationStateAsync();
|
| 357 |
+
canUpdateTask = authState.User.IsInRole("Admin") || await MenuAuthorization.HasAccessCodeAsync(authState.User, "Tasks_Update");
|
| 358 |
var client = ApiClient.CreateClient();
|
| 359 |
try
|
| 360 |
{
|
|
|
|
| 461 |
|
| 462 |
private async Task SaveDueDateAdjustment()
|
| 463 |
{
|
| 464 |
+
if (!canUpdateTask)
|
| 465 |
+
{
|
| 466 |
+
return;
|
| 467 |
+
}
|
| 468 |
+
|
| 469 |
if (selectedTaskForAdjustment == null) return;
|
| 470 |
|
| 471 |
isAdjusting = true;
|
TaskTrackingSystem.WebApp/Components/Pages/Tasks.razor
CHANGED
|
@@ -209,8 +209,8 @@
|
|
| 209 |
{
|
| 210 |
@foreach (var task in tasksInColumn)
|
| 211 |
{
|
| 212 |
-
<div class="rounded-lg border border-slate-200 bg-white p-4 shadow-sm hover:shadow-md transition-all cursor-grab active:cursor-grabbing"
|
| 213 |
-
draggable="
|
| 214 |
@ondragstart="() => HandleDragStart(task)">
|
| 215 |
<div class="flex items-start justify-between">
|
| 216 |
<h4 class="text-sm font-semibold text-slate-900">@task.Title</h4>
|
|
@@ -543,6 +543,12 @@
|
|
| 543 |
|
| 544 |
private async Task HandleDrop(long newStatusId)
|
| 545 |
{
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 546 |
if (draggedTask != null && draggedTask.StatusId != newStatusId)
|
| 547 |
{
|
| 548 |
await MoveTask(draggedTask.Id, newStatusId);
|
|
@@ -552,6 +558,11 @@
|
|
| 552 |
|
| 553 |
private async Task MoveTask(long taskId, long newStatusId)
|
| 554 |
{
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 555 |
var client = ApiClient.CreateClient();
|
| 556 |
try
|
| 557 |
{
|
|
@@ -600,6 +611,11 @@
|
|
| 600 |
|
| 601 |
private async Task ToggleTaskStatus(TaskDto task)
|
| 602 |
{
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 603 |
var newStatusId = task.StatusId == 3 ? 1 : 3;
|
| 604 |
var client = ApiClient.CreateClient();
|
| 605 |
try
|
|
|
|
| 209 |
{
|
| 210 |
@foreach (var task in tasksInColumn)
|
| 211 |
{
|
| 212 |
+
<div class="rounded-lg border border-slate-200 bg-white p-4 shadow-sm hover:shadow-md transition-all @(canUpdateTask ? "cursor-grab active:cursor-grabbing" : "cursor-default")"
|
| 213 |
+
draggable="@canUpdateTask"
|
| 214 |
@ondragstart="() => HandleDragStart(task)">
|
| 215 |
<div class="flex items-start justify-between">
|
| 216 |
<h4 class="text-sm font-semibold text-slate-900">@task.Title</h4>
|
|
|
|
| 543 |
|
| 544 |
private async Task HandleDrop(long newStatusId)
|
| 545 |
{
|
| 546 |
+
if (!canUpdateTask)
|
| 547 |
+
{
|
| 548 |
+
draggedTask = null;
|
| 549 |
+
return;
|
| 550 |
+
}
|
| 551 |
+
|
| 552 |
if (draggedTask != null && draggedTask.StatusId != newStatusId)
|
| 553 |
{
|
| 554 |
await MoveTask(draggedTask.Id, newStatusId);
|
|
|
|
| 558 |
|
| 559 |
private async Task MoveTask(long taskId, long newStatusId)
|
| 560 |
{
|
| 561 |
+
if (!canUpdateTask)
|
| 562 |
+
{
|
| 563 |
+
return;
|
| 564 |
+
}
|
| 565 |
+
|
| 566 |
var client = ApiClient.CreateClient();
|
| 567 |
try
|
| 568 |
{
|
|
|
|
| 611 |
|
| 612 |
private async Task ToggleTaskStatus(TaskDto task)
|
| 613 |
{
|
| 614 |
+
if (!canUpdateTask)
|
| 615 |
+
{
|
| 616 |
+
return;
|
| 617 |
+
}
|
| 618 |
+
|
| 619 |
var newStatusId = task.StatusId == 3 ? 1 : 3;
|
| 620 |
var client = ApiClient.CreateClient();
|
| 621 |
try
|