diff --git a/CheckDrive.Web/CheckDrive.Web/Controllers/CarsController.cs b/CheckDrive.Web/CheckDrive.Web/Controllers/CarsController.cs index d21a721e..4749527b 100644 --- a/CheckDrive.Web/CheckDrive.Web/Controllers/CarsController.cs +++ b/CheckDrive.Web/CheckDrive.Web/Controllers/CarsController.cs @@ -46,7 +46,7 @@ public async Task<IActionResult> DetailsForMechanicHandover(int id) public async Task<IActionResult> Create() { - var oilMarks = await GetOilMarkAsync(); + var oilMarks = await GetOilMarksAsync(); ViewBag.OilMarks = oilMarks; return View(); @@ -58,7 +58,7 @@ public async Task<IActionResult> Create([FromForm] CreateCarRequest request) { if (ModelState.IsValid) { - var newCar = await carStore.CreateAsync(request); + await carStore.CreateAsync(request); return RedirectToAction(nameof(Index)); } return BadRequest(ModelState); @@ -67,7 +67,7 @@ public async Task<IActionResult> Create([FromForm] CreateCarRequest request) public async Task<IActionResult> Edit(int id) { var car = await carStore.GetByIdAsync(id); - var oilMarks = await GetOilMarkAsync(); + var oilMarks = await GetOilMarksAsync(car.OilMarkId); ViewBag.OilMarks = oilMarks; var carRequest = car.ToUpdateViewModel(); @@ -108,7 +108,7 @@ public async Task<IActionResult> DeleteConfirmed(int id) return RedirectToAction(nameof(Index)); } - private async Task<List<SelectListItem>> GetOilMarkAsync() + private async Task<List<SelectListItem>> GetOilMarksAsync(int? oilMarkId = default) { var oilMarks = await oilMarkStore.GetAsync(); @@ -116,8 +116,9 @@ private async Task<List<SelectListItem>> GetOilMarkAsync() .Select(e => new SelectListItem() { Value = e.Id.ToString(), - Text = e.Name.ToString() + Text = e.Name.ToString(), + Selected = e.Id == oilMarkId }) .ToList(); } -} \ No newline at end of file +} diff --git a/CheckDrive.Web/CheckDrive.Web/Controllers/CheckPointController.cs b/CheckDrive.Web/CheckDrive.Web/Controllers/CheckPointController.cs index c8444e18..8593c1e4 100644 --- a/CheckDrive.Web/CheckDrive.Web/Controllers/CheckPointController.cs +++ b/CheckDrive.Web/CheckDrive.Web/Controllers/CheckPointController.cs @@ -1,20 +1,40 @@ -using CheckDrive.Web.Stores.CheckPoint; +using CheckDrive.Web.Mappings; +using CheckDrive.Web.Services.CurrentUserService; +using CheckDrive.Web.Stores.CheckPoint; +using CheckDrive.Web.Stores.ManagerReview; +using CheckDrive.Web.ViewModels.CheckPoint; using Microsoft.AspNetCore.Mvc; -namespace CheckDrive.Web.Controllers +namespace CheckDrive.Web.Controllers; + +public class CheckPointController( + ICheckPointStore checkPointStore, + IManagerReviewStore managerReviewStore, + ICurrentUserService currentUserService) : Controller { - public class CheckPointController : Controller + public async Task<ActionResult> Details(int id) + { + var checkPoint = await checkPointStore.GetByIdAsync(id); + + return View(checkPoint); + } + + [HttpPost] + [ValidateAntiForgeryToken] + public async Task<ActionResult> Create(CheckPointViewModel model) { - private readonly ICheckPointStore _checkPointStore; - public CheckPointController(ICheckPointStore checkPointStore) + try { - _checkPointStore = checkPointStore ?? throw new ArgumentNullException(nameof(checkPointStore)); + var createManagerReviewRequest = model.ToCreateManagerReviewRequest(); + createManagerReviewRequest.ReviewerId = currentUserService.GetUserId(); + + var createdReview = await managerReviewStore.CreateAsync(createManagerReviewRequest); + + return RedirectToAction("Index", "Home"); } - public async Task<ActionResult> Index(int id) + catch { - var checkPoint = await _checkPointStore.GetCheckPointByIdAsync(id); - - return View(checkPoint); + return View(model); } } } diff --git a/CheckDrive.Web/CheckDrive.Web/Controllers/DebtsController.cs b/CheckDrive.Web/CheckDrive.Web/Controllers/DebtsController.cs index b8a1d775..8a7ae55d 100644 --- a/CheckDrive.Web/CheckDrive.Web/Controllers/DebtsController.cs +++ b/CheckDrive.Web/CheckDrive.Web/Controllers/DebtsController.cs @@ -1,24 +1,19 @@ -using System.ComponentModel.DataAnnotations; -using System.Reflection; -using CheckDrive.Web.Mappings; +using CheckDrive.Web.Mappings; using CheckDrive.Web.Models.Enums; using CheckDrive.Web.Requests.Debt; using CheckDrive.Web.Stores.Debts; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Rendering; +using System.ComponentModel.DataAnnotations; +using System.Reflection; namespace CheckDrive.Web.Controllers; -public class DebtsController : Controller +public class DebtsController(IDebtsStore debtStore) : Controller { - private readonly IDebtsStore _debtStore; - public DebtsController(IDebtsStore debtStore) - { - _debtStore = debtStore ?? throw new ArgumentNullException(nameof(debtStore)); - } public async Task<ActionResult> Index() { - var debts = await _debtStore.GetAsync(); + var debts = await debtStore.GetAsync(); ViewBag.SelectedStatus = GetDebtStatuses(); @@ -28,19 +23,19 @@ public async Task<ActionResult> Index() [HttpGet] public async Task<ActionResult> Edit(int id) { - var debt = await _debtStore.GetByIdAsync(id); + var debt = await debtStore.GetByIdAsync(id); var updateRequest = debt.ToUpdateViewModel(); - + return View(updateRequest); } [HttpPost] public async Task<ActionResult> Edit(UpdateDebtRequest request) - { + { request.Status = DebtStatus.Paid; - await _debtStore.UpdateAsync(request); + await debtStore.UpdateAsync(request); return RedirectToAction(nameof(Index)); } @@ -53,11 +48,11 @@ private static List<SelectListItem> GetDebtStatuses() .Where(e => excludedStatuses.Contains(e)) .Select(e => new SelectListItem() { - Value = e.ToString(), + Value = ((int)e).ToString(), Text = e.GetType().GetField(e.ToString())?.GetCustomAttribute<DisplayAttribute>()?.Name ?? e.ToString() }) .ToList(); - + return statuses; } } diff --git a/CheckDrive.Web/CheckDrive.Web/Controllers/EmployeesController.cs b/CheckDrive.Web/CheckDrive.Web/Controllers/EmployeesController.cs index ab302c67..77c92b84 100644 --- a/CheckDrive.Web/CheckDrive.Web/Controllers/EmployeesController.cs +++ b/CheckDrive.Web/CheckDrive.Web/Controllers/EmployeesController.cs @@ -12,6 +12,8 @@ namespace CheckDrive.Web.Controllers; public class EmployeesController(IEmployeeStore employeeStore, ICarStore carStore) : Controller { + private static readonly EmployeePosition[] excludedPositions = [EmployeePosition.Custom]; + public async Task<ActionResult> Index() { var employees = await employeeStore.GetAsync(); @@ -42,7 +44,7 @@ public async Task<ActionResult> Create(CreateEmployeeRequest request) try { var createdEmployee = await employeeStore.CreateAsync(request); - + return RedirectToAction(nameof(Index)); } catch @@ -54,7 +56,7 @@ public async Task<ActionResult> Create(CreateEmployeeRequest request) public async Task<ActionResult> Edit(int id) { var employee = await employeeStore.GetByIdAsync(id); - ViewBag.Positions = GetPositions(); + ViewBag.Positions = GetPositions(employee.Position); ViewBag.Cars = await GetCarsAsync(); var updateRequest = employee.ToUpdateViewModel(); @@ -99,16 +101,16 @@ public async Task<ActionResult> Delete(int id, IFormCollection _) } } - private static List<SelectListItem> GetPositions() + private static List<SelectListItem> GetPositions(EmployeePosition? selectedPosition = EmployeePosition.Driver) { - var excludedPositions = new[] { EmployeePosition.Manager, EmployeePosition.Custom }; var positions = Enum.GetValues(typeof(EmployeePosition)) .Cast<EmployeePosition>() .Where(e => !excludedPositions.Contains(e)) .Select(e => new SelectListItem() { Value = e.ToString(), - Text = e.GetType().GetField(e.ToString())?.GetCustomAttribute<DisplayAttribute>()?.Name ?? e.ToString() + Text = e.GetType().GetField(e.ToString())?.GetCustomAttribute<DisplayAttribute>()?.Name ?? e.ToString(), + Selected = e == selectedPosition }) .ToList(); @@ -123,7 +125,7 @@ private async Task<List<SelectListItem>> GetCarsAsync() .Select(e => new SelectListItem() { Value = e.Id.ToString(), - Text = e.ToString() + Text = $"{e.Model} ({e.Number})" }) .ToList(); } diff --git a/CheckDrive.Web/CheckDrive.Web/Controllers/ErrorController.cs b/CheckDrive.Web/CheckDrive.Web/Controllers/ErrorController.cs index 67816b7e..fddea834 100644 --- a/CheckDrive.Web/CheckDrive.Web/Controllers/ErrorController.cs +++ b/CheckDrive.Web/CheckDrive.Web/Controllers/ErrorController.cs @@ -5,10 +5,7 @@ namespace CheckDrive.Web.Controllers; [Route("Error")] public class ErrorController : Controller { - public IActionResult Index() - { - return View(); - } + public IActionResult Index() => View(); [Route("{statusCode:int}")] public IActionResult ErrorPage(int statusCode) @@ -23,28 +20,13 @@ public IActionResult ErrorPage(int statusCode) }; } - public IActionResult Unauthorized() - { - return View(); - } + public IActionResult Unauthorized() => View(); - public IActionResult Forbidden() - { - return View(); - } + public IActionResult Forbidden() => View(); - public IActionResult NotFound() - { - return View(); - } + public IActionResult NotFound() => View(); - public IActionResult InternalServerError() - { - return View(); - } + public IActionResult InternalServerError() => View(); - public IActionResult Error409() - { - return View(); - } + public IActionResult Error409() => View(); } diff --git a/CheckDrive.Web/CheckDrive.Web/Controllers/OilMarksController.cs b/CheckDrive.Web/CheckDrive.Web/Controllers/OilMarksController.cs index 573135b8..2cf18fb4 100644 --- a/CheckDrive.Web/CheckDrive.Web/Controllers/OilMarksController.cs +++ b/CheckDrive.Web/CheckDrive.Web/Controllers/OilMarksController.cs @@ -1,4 +1,5 @@ -using CheckDrive.Web.Requests.OilMark; +using CheckDrive.Web.Mappings; +using CheckDrive.Web.Requests.OilMark; using CheckDrive.Web.Stores.OilMarks; using Microsoft.AspNetCore.Mvc; @@ -20,10 +21,7 @@ public async Task<IActionResult> Details(int id) return View(oilMark); } - public IActionResult Create() - { - return View(); - } + public IActionResult Create() => View(); [HttpPost] [ValidateAntiForgeryToken] @@ -40,8 +38,9 @@ public async Task<IActionResult> Create([FromForm] CreateOilMarkRequest request) public async Task<IActionResult> Edit(int id) { var oilMark = await oilMarkDataStore.GetByIdAsync(id); + var updateRequest = oilMark.ToUpdateViewModel(); - return View(oilMark); + return View(updateRequest); } [HttpPost] diff --git a/CheckDrive.Web/CheckDrive.Web/Extensions/DependencyInjection.cs b/CheckDrive.Web/CheckDrive.Web/Extensions/DependencyInjection.cs index 8b324f60..eb0c7a68 100644 --- a/CheckDrive.Web/CheckDrive.Web/Extensions/DependencyInjection.cs +++ b/CheckDrive.Web/CheckDrive.Web/Extensions/DependencyInjection.cs @@ -5,29 +5,15 @@ using CheckDrive.Web.Services; using CheckDrive.Web.Services.CookieHandler; using CheckDrive.Web.Services.CurrentUserService; -using CheckDrive.Web.Stores.Accounts; using CheckDrive.Web.Stores.Auth; using CheckDrive.Web.Stores.Cars; using CheckDrive.Web.Stores.CheckPoint; using CheckDrive.Web.Stores.Dashboard; using CheckDrive.Web.Stores.Debts; -using CheckDrive.Web.Stores.DispatcherReviews; -using CheckDrive.Web.Stores.Dispatchers; -using CheckDrive.Web.Stores.DoctorReviews; -using CheckDrive.Web.Stores.Doctors; -using CheckDrive.Web.Stores.Drivers; using CheckDrive.Web.Stores.Employee; -using CheckDrive.Web.Stores.MechanicAcceptances; -using CheckDrive.Web.Stores.MechanicHandovers; -using CheckDrive.Web.Stores.Mechanics; +using CheckDrive.Web.Stores.ManagerReview; using CheckDrive.Web.Stores.Menu; -using CheckDrive.Web.Stores.MockDashboard; using CheckDrive.Web.Stores.OilMarks; -using CheckDrive.Web.Stores.OperatorReviews; -using CheckDrive.Web.Stores.Operators; -using CheckDrive.Web.Stores.Roles; -using CheckDrive.Web.Stores.Technicians; -using CheckDrive.Web.Stores.User; using Syncfusion.Licensing; namespace CheckDrive.Web.Extensions; @@ -58,28 +44,14 @@ private static void AddConfigurations(IServiceCollection services, IConfiguratio private static void AddStores(IServiceCollection services) { - services.AddScoped<IAccountDataStore, AccountDataStore>(); services.AddScoped<ICarStore, CarStore>(); - services.AddScoped<IDispatcherReviewDataStore, DispatcherReviewDataStore>(); - services.AddScoped<IDispatcherDataStore, DispatcherDataStore>(); - services.AddScoped<IDoctorDataStore, DoctorDataStore>(); - services.AddScoped<IDoctorReviewDataStore, DoctorReviewDataStore>(); - services.AddScoped<IDriverDataStore, DriverDataStore>(); - services.AddScoped<IMechanicAcceptanceDataStore, MechanicAcceptanceDataStore>(); - services.AddScoped<IMechanicHandoverDataStore, MechanicHandoverDataStore>(); - services.AddScoped<IMechanicDataStore, MechanicDataStore>(); services.AddScoped<IOilMarkStore, OilMarkStore>(); - services.AddScoped<IOperatorReviewDataStore, OperatorReviewDataStore>(); - services.AddScoped<IOperatorDataStore, OperatorDataStore>(); - services.AddScoped<IRoleDataStore, RoleDataStore>(); - services.AddScoped<ITechnicianDataStore, MockTechnicianDataStore>(); services.AddScoped<IDashboardStore, DashboardStore>(); - services.AddScoped<IMockDashboardStore, MockDashboardStore>(); services.AddScoped<IDebtsStore, DebtsStore>(); - services.AddScoped<IUserDataStore, UserDataStore>(); services.AddScoped<ICheckPointStore, CheckPointStore>(); services.AddScoped<IAuthStore, AuthStore>(); services.AddScoped<IEmployeeStore, EmployeeStore>(); + services.AddScoped<IManagerReviewStore, ManagerReviewStore>(); } private static void AddServices(IServiceCollection services) @@ -122,4 +94,4 @@ private static void RegisterLicenses(IConfiguration configuration) SyncfusionLicenseProvider.RegisterLicense(key); } -} +} \ No newline at end of file diff --git a/CheckDrive.Web/CheckDrive.Web/Helpers/AuthorizationHandler.cs b/CheckDrive.Web/CheckDrive.Web/Helpers/AuthorizationHandler.cs index 230bafe3..5d8d4157 100644 --- a/CheckDrive.Web/CheckDrive.Web/Helpers/AuthorizationHandler.cs +++ b/CheckDrive.Web/CheckDrive.Web/Helpers/AuthorizationHandler.cs @@ -4,6 +4,7 @@ using CheckDrive.Web.Requests.Auth; using CheckDrive.Web.Services.CookieHandler; using CheckDrive.Web.Stores.Auth; +using Microsoft.IdentityModel.Tokens; namespace CheckDrive.Web.Helpers; @@ -33,6 +34,11 @@ private async Task TryAddAuthorizationHeadersAsync(HttpRequestMessage request) var (accessToken, refreshToken) = cookieHandler.GetTokens(); + if (accessToken is null || refreshToken is null) + { + throw new SecurityTokenException("Access token or refresh token is missing."); + } + if (JwtHelper.IsValid(accessToken)) { request.Headers.Authorization = new AuthenticationHeaderValue(HeaderConstants.AuthenticationSchema, accessToken); diff --git a/CheckDrive.Web/CheckDrive.Web/Helpers/JwtHelper.cs b/CheckDrive.Web/CheckDrive.Web/Helpers/JwtHelper.cs index 6a57249b..797a43df 100644 --- a/CheckDrive.Web/CheckDrive.Web/Helpers/JwtHelper.cs +++ b/CheckDrive.Web/CheckDrive.Web/Helpers/JwtHelper.cs @@ -1,7 +1,7 @@ -using System.Diagnostics.CodeAnalysis; +using Microsoft.IdentityModel.Tokens; +using System.Diagnostics.CodeAnalysis; using System.IdentityModel.Tokens.Jwt; using System.Security.Claims; -using Microsoft.IdentityModel.Tokens; namespace CheckDrive.Web.Helpers; @@ -28,11 +28,13 @@ public static string GetAccountId(string token) return jwtToken.Claims.First(c => c.Type == ClaimTypes.PrimarySid).Value; } - public static string GetUserId(string token) + public static int GetUserId(string token) { var jwtToken = ValidateOrThrow(token); - return jwtToken.Claims.First(c => c.Type == ClaimTypes.NameIdentifier).Value; + var userId = jwtToken.Claims.First(c => c.Type == ClaimTypes.NameIdentifier).Value; + + return int.Parse(userId); } public static string GetUserRole(string token) diff --git a/CheckDrive.Web/CheckDrive.Web/Mappings/CarMappings.cs b/CheckDrive.Web/CheckDrive.Web/Mappings/CarMappings.cs index 9d24ff56..62d5670d 100644 --- a/CheckDrive.Web/CheckDrive.Web/Mappings/CarMappings.cs +++ b/CheckDrive.Web/CheckDrive.Web/Mappings/CarMappings.cs @@ -14,12 +14,8 @@ public static UpdateCarRequest ToUpdateViewModel(this CarViewModel car) => Number = car.Number, ManufacturedYear = car.ManufacturedYear, Mileage = car.Mileage, - CurrentMonthMileage = car.CurrentMonthMileage, - CurrentYearMileage = car.CurrentYearMileage, MonthlyDistanceLimit = car.MonthlyDistanceLimit, YearlyDistanceLimit = car.YearlyDistanceLimit, - CurrentMonthFuelConsumption = car.CurrentMonthFuelConsumption, - CurrentYearFuelConsumption = car.CurrentYearFuelConsumption, MonthlyFuelConsumptionLimit = car.MonthlyFuelConsumptionLimit, YearlyFuelConsumptionLimit = car.YearlyFuelConsumptionLimit, AverageFuelConsumption = car.AverageFuelConsumption, diff --git a/CheckDrive.Web/CheckDrive.Web/Mappings/CheckPointMappings.cs b/CheckDrive.Web/CheckDrive.Web/Mappings/CheckPointMappings.cs new file mode 100644 index 00000000..a34f7728 --- /dev/null +++ b/CheckDrive.Web/CheckDrive.Web/Mappings/CheckPointMappings.cs @@ -0,0 +1,19 @@ +using CheckDrive.Web.Requests.ManagerReview; +using CheckDrive.Web.ViewModels.CheckPoint; + +namespace CheckDrive.Web.Mappings; + +public static class CheckPointMappings +{ + public static CreateManagerReviewRequest ToCreateManagerReviewRequest(this CheckPointViewModel model) => + new() + { + CheckPointId = model.Id, + InitialMillage = model.InitialMillage, + FinalMillage = model.FinalMileage, + FuelConsumption = model.FuelConsumptionAdjustment, + RemainingFuelAmount = model.OilRefillAmount, + DebtAmount = model.DebtAmount, + Notes = model.Notes, + }; +} diff --git a/CheckDrive.Web/CheckDrive.Web/Mappings/OilMarkMappings.cs b/CheckDrive.Web/CheckDrive.Web/Mappings/OilMarkMappings.cs new file mode 100644 index 00000000..2cf1bb42 --- /dev/null +++ b/CheckDrive.Web/CheckDrive.Web/Mappings/OilMarkMappings.cs @@ -0,0 +1,14 @@ +using CheckDrive.Web.Requests.OilMark; +using CheckDrive.Web.ViewModels.OilMark; + +namespace CheckDrive.Web.Mappings; + +public static class OilMarkMappings +{ + public static UpdateOilMarkRequest ToUpdateViewModel(this OilMarkViewModel oilMark) => + new() + { + Id = oilMark.Id, + Name = oilMark.Name + }; +} diff --git a/CheckDrive.Web/CheckDrive.Web/Models/Account.cs b/CheckDrive.Web/CheckDrive.Web/Models/Account.cs deleted file mode 100644 index acc3f759..00000000 --- a/CheckDrive.Web/CheckDrive.Web/Models/Account.cs +++ /dev/null @@ -1,24 +0,0 @@ -namespace CheckDrive.Web.Models -{ - public class Account - { - public int Id { get; set; } - public string Login { get; set; } - public string Password { get; set; } - public string PhoneNumber { get; set; } - public string FirstName { get; set; } - public string LastName { get; set; } - public DateTime Bithdate { get; set; } - - public string RoleName { get; set; } - public Role Role { get; set; } - - public virtual ICollection<Dispatcher> Dispatchers { get; set; } - public virtual ICollection<Operator> Operators { get; set; } - public virtual ICollection<Mechanic> Mechanics { get; set; } - public virtual ICollection<Driver> Drivers { get; set; } - public virtual ICollection<Doctor> Doctors { get; set; } - public virtual ICollection<Technician> Technicians { get; set; } - } -} - diff --git a/CheckDrive.Web/CheckDrive.Web/Models/Dispatcher.cs b/CheckDrive.Web/CheckDrive.Web/Models/Dispatcher.cs deleted file mode 100644 index 185908e4..00000000 --- a/CheckDrive.Web/CheckDrive.Web/Models/Dispatcher.cs +++ /dev/null @@ -1,11 +0,0 @@ -namespace CheckDrive.Web.Models -{ - public class Dispatcher - { - public int Id { get; set; } - public int AccountId { get; set; } - public Account Account { get; set; } - - public virtual ICollection<DispatcherReview> DispetcherReviews { get; set; } - } -} diff --git a/CheckDrive.Web/CheckDrive.Web/Models/DispatcherReview.cs b/CheckDrive.Web/CheckDrive.Web/Models/DispatcherReview.cs deleted file mode 100644 index e0b60dec..00000000 --- a/CheckDrive.Web/CheckDrive.Web/Models/DispatcherReview.cs +++ /dev/null @@ -1,19 +0,0 @@ -namespace CheckDrive.Web.Models -{ - public class DispatcherReview - { - public int Id { get; set; } - public double FuelSpended { get; set; } - public double DistanceCovered { get; set; } - public DateTime Date { get; set; } - - public int DispatcherId { get; set; } - public Dispatcher Dispatcher { get; set; } - public int OperatorId { get; set; } - public Operator Operator { get; set; } - public int MechanicId { get; set; } - public Mechanic Mechanic { get; set; } - public int DriverId { get; set; } - public Driver Driver { get; set; } - } -} diff --git a/CheckDrive.Web/CheckDrive.Web/Models/Doctor.cs b/CheckDrive.Web/CheckDrive.Web/Models/Doctor.cs deleted file mode 100644 index d0de4b93..00000000 --- a/CheckDrive.Web/CheckDrive.Web/Models/Doctor.cs +++ /dev/null @@ -1,11 +0,0 @@ -namespace CheckDrive.Web.Models -{ - public class Doctor - { - public int Id { get; set; } - public int AccountId { get; set; } - public Account Account { get; set; } - - public virtual ICollection<DoctorReview> DoctorReviews { get; set; } - } -} diff --git a/CheckDrive.Web/CheckDrive.Web/Models/DoctorReview.cs b/CheckDrive.Web/CheckDrive.Web/Models/DoctorReview.cs deleted file mode 100644 index a80ef7d7..00000000 --- a/CheckDrive.Web/CheckDrive.Web/Models/DoctorReview.cs +++ /dev/null @@ -1,15 +0,0 @@ -namespace CheckDrive.Web.Models -{ - public class DoctorReview - { - public int Id { get; set; } - public bool IsHealthy { get; set; } - public string? Comments { get; set; } - public DateTime Date { get; set; } - - public int DriverId { get; set; } - public Driver Driver { get; set; } - public int DoctorId { get; set; } - public Doctor Doctor { get; set; } - } -} diff --git a/CheckDrive.Web/CheckDrive.Web/Models/Driver.cs b/CheckDrive.Web/CheckDrive.Web/Models/Driver.cs deleted file mode 100644 index a119b9bc..00000000 --- a/CheckDrive.Web/CheckDrive.Web/Models/Driver.cs +++ /dev/null @@ -1,14 +0,0 @@ -namespace CheckDrive.Web.Models -{ - public class Driver - { - public int Id { get; set; } - public int AccountId { get; set; } - public Account Account { get; set; } - - public virtual ICollection<DispatcherReview> DispetcherReviews { get; set; } - public virtual ICollection<DoctorReview> DoctorReviews { get; set; } - public virtual ICollection<MechanicHandover> MechanicHandovers { get; set; } - public virtual ICollection<OperatorReview> OperatorReviews { get; set; } - } -} diff --git a/CheckDrive.Web/CheckDrive.Web/Models/Mechanic.cs b/CheckDrive.Web/CheckDrive.Web/Models/Mechanic.cs deleted file mode 100644 index 552b0abb..00000000 --- a/CheckDrive.Web/CheckDrive.Web/Models/Mechanic.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace CheckDrive.Web.Models -{ - public class Mechanic - { - public int Id { get; set; } - public int AccountId { get; set; } - public Account Account { get; set; } - - public virtual ICollection<DispatcherReview> DispetcherReviews { get; set; } - public virtual ICollection<MechanicHandover> MechanicHandovers { get; set; } - } -} diff --git a/CheckDrive.Web/CheckDrive.Web/Models/MechanicAcceptance.cs b/CheckDrive.Web/CheckDrive.Web/Models/MechanicAcceptance.cs deleted file mode 100644 index f65de77e..00000000 --- a/CheckDrive.Web/CheckDrive.Web/Models/MechanicAcceptance.cs +++ /dev/null @@ -1,16 +0,0 @@ -namespace CheckDrive.Web.Models -{ - public class MechanicAcceptance - { - public int Id { get; set; } - - public bool IsAccepted { get; set; } - public string? Comments { get; set; } - public Status Status { get; set; } - public DateTime Date { get; set; } - public double Distance { get; set; } - - public int MechanicHandoverId { get; set; } - public MechanicHandover MechanicHandover { get; set; } - } -} diff --git a/CheckDrive.Web/CheckDrive.Web/Models/MechanicHandover.cs b/CheckDrive.Web/CheckDrive.Web/Models/MechanicHandover.cs deleted file mode 100644 index 0f8e844a..00000000 --- a/CheckDrive.Web/CheckDrive.Web/Models/MechanicHandover.cs +++ /dev/null @@ -1,20 +0,0 @@ -namespace CheckDrive.Web.Models -{ - public class MechanicHandover - { - public int Id { get; set; } - public bool IsHanded { get; set; } - public string? Comments { get; set; } - public Status Status { get; set; } - public DateTime Date { get; set; } - - public int MechanicId { get; set; } - public Mechanic Mechanic { get; set; } - public int CarId { get; set; } - public Car Car { get; set; } - public int DriverId { get; set; } - public Driver Driver { get; set; } - - public virtual ICollection<MechanicAcceptance> MechanicAcceptances { get; set; } - } -} diff --git a/CheckDrive.Web/CheckDrive.Web/Models/Operator.cs b/CheckDrive.Web/CheckDrive.Web/Models/Operator.cs deleted file mode 100644 index e8461803..00000000 --- a/CheckDrive.Web/CheckDrive.Web/Models/Operator.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace CheckDrive.Web.Models -{ - public class Operator - { - public int Id { get; set; } - public int AccountId { get; set; } - public Account Account { get; set; } - - public virtual ICollection<DispatcherReview> DispetcherReviews { get; set; } - public virtual ICollection<OperatorReview> OperatorReviews { get; set; } - } -} diff --git a/CheckDrive.Web/CheckDrive.Web/Models/OperatorReview.cs b/CheckDrive.Web/CheckDrive.Web/Models/OperatorReview.cs deleted file mode 100644 index 730de0dd..00000000 --- a/CheckDrive.Web/CheckDrive.Web/Models/OperatorReview.cs +++ /dev/null @@ -1,16 +0,0 @@ -namespace CheckDrive.Web.Models -{ - public class OperatorReview - { - public int Id { get; set; } - public double OilAmount { get; set; } - public string? Comments { get; set; } - public Status Status { get; set; } - public DateTime Date { get; set; } - - public int OperatorId { get; set; } - public Operator Operator { get; set; } - public int DriverId { get; set; } - public Driver Driver { get; set; } - } -} diff --git a/CheckDrive.Web/CheckDrive.Web/Models/Role.cs b/CheckDrive.Web/CheckDrive.Web/Models/Role.cs deleted file mode 100644 index 38d20dee..00000000 --- a/CheckDrive.Web/CheckDrive.Web/Models/Role.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace CheckDrive.Web.Models -{ - public class Role - { - public int Id { get; set; } - public string Name { get; set; } - - public virtual ICollection<Account> Accounts { get; set; } - } -} diff --git a/CheckDrive.Web/CheckDrive.Web/Models/Status.cs b/CheckDrive.Web/CheckDrive.Web/Models/Status.cs deleted file mode 100644 index a7174006..00000000 --- a/CheckDrive.Web/CheckDrive.Web/Models/Status.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace CheckDrive.Web.Models -{ - public enum Status - { - Pending, - Completed, - Rejected, - Unassigned - } -} diff --git a/CheckDrive.Web/CheckDrive.Web/Models/Technician.cs b/CheckDrive.Web/CheckDrive.Web/Models/Technician.cs deleted file mode 100644 index 65a4cb45..00000000 --- a/CheckDrive.Web/CheckDrive.Web/Models/Technician.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace CheckDrive.Web.Models -{ - public class Technician - { - public int Id { get; set; } - public int AccountId { get; set; } - public Account Account { get; set; } - } -} diff --git a/CheckDrive.Web/CheckDrive.Web/Requests/Cars/CreateCarRequest.cs b/CheckDrive.Web/CheckDrive.Web/Requests/Cars/CreateCarRequest.cs index 1ecfe239..94bb6769 100644 --- a/CheckDrive.Web/CheckDrive.Web/Requests/Cars/CreateCarRequest.cs +++ b/CheckDrive.Web/CheckDrive.Web/Requests/Cars/CreateCarRequest.cs @@ -1,24 +1,56 @@ using CheckDrive.Web.Models.Enums; +using System.ComponentModel.DataAnnotations; namespace CheckDrive.Web.Requests.Cars; public class CreateCarRequest { - public int OilMarkId { get; set; } + [Required(ErrorMessage = "Avtomobil modeli majburiy")] + [StringLength(25, MinimumLength = 2, ErrorMessage = "Belgilar soni 2 va 25 orasida bo'lishi kerak")] public required string Model { get; set; } + + [Required(ErrorMessage = "Davlat raqami majburiy")] + [StringLength(10, MinimumLength = 8, ErrorMessage = "Belgilar soni 8 va 10 orasida bo'lishi kerak")] public required string Number { get; set; } + + [Required(ErrorMessage = "Ishlab chiqarilgan yili majburiy")] + [Range(1, int.MaxValue, ErrorMessage = "Ishlab chiqarilgan yil noto'g'ri")] public int ManufacturedYear { get; set; } + + [Required(ErrorMessage = "Bosib o'tilgan masofasi [km]")] + [Range(0, double.MaxValue, ErrorMessage = "Bosib o'tgan masofasi manfiy bo'lishi mumkin emas")] public decimal Mileage { get; set; } - public decimal CurrentMonthMileage { get; set; } - public decimal CurrentYearMileage { get; set; } + + [Required(ErrorMessage = "1 yillik bosib o'tish me'yori [km] majburiy")] + [Range(0, double.MaxValue, ErrorMessage = "Yillik masofa chegarasi manfiy bo'lishi mumkin emas")] public decimal YearlyDistanceLimit { get; set; } + + [Required(ErrorMessage = "1 oylik bosib o'tish me'yori [km] majburiy")] + [Range(0, double.MaxValue, ErrorMessage = "Oylik masofa chegarasi manfiy bo'lishi mumkin emas")] public decimal MonthlyDistanceLimit { get; set; } - public decimal CurrentMonthFuelConsumption { get; set; } - public decimal CurrentYearFuelConsumption { get; set; } + + [Required(ErrorMessage = "1 oylik yoqilg'i me'yori [litr] majburiy")] + [Range(0, double.MaxValue, ErrorMessage = "Oylik yoqilg'i sarfi chegarasi manfiy bo'lishi mumkin emas")] public decimal MonthlyFuelConsumptionLimit { get; set; } + + [Required(ErrorMessage = "1 yillik yoqilg'i me'yori [litr] majburiy")] + [Range(1, double.MaxValue, ErrorMessage = "Yillik yoqilg'i sarfi chegarasi manfiy bo'lishi mumkin emas")] public decimal YearlyFuelConsumptionLimit { get; set; } + + [Required(ErrorMessage = "100 km uchun yoqilg'i me'yori [litr]")] + [Range(1, double.MaxValue, ErrorMessage = "100 km uchun yoqilg'i me'yori [litr] manfiy bo'lishi mumkin emas")] public decimal AverageFuelConsumption { get; set; } + + [Required(ErrorMessage = "Yoqilg'i baki sig'imi majburiy")] + [Range(10, 300, ErrorMessage = "Yoqilg'i baki sig'imi 0 va 300 oralig'ida bo'lishi kerak")] public decimal FuelCapacity { get; set; } + + [Required(ErrorMessage = "Avtomobildagi yoqilg'i qoldig'i [litr] majburiy")] + [Range(0, 300, ErrorMessage = "Qolgan yoqilg'i miqdori 0 va 300 oralig'ida bo'lishi kerak")] public decimal RemainingFuel { get; set; } - public CarStatus Status { get; set; } + + public CarStatus Status { get; set; } = CarStatus.Free; + + [Range(1, int.MaxValue, ErrorMessage = "Moy markasi noto'g'ri")] + public int? OilMarkId { get; set; } } diff --git a/CheckDrive.Web/CheckDrive.Web/Requests/ManagerReview/CreateManagerReviewRequest.cs b/CheckDrive.Web/CheckDrive.Web/Requests/ManagerReview/CreateManagerReviewRequest.cs new file mode 100644 index 00000000..6096b269 --- /dev/null +++ b/CheckDrive.Web/CheckDrive.Web/Requests/ManagerReview/CreateManagerReviewRequest.cs @@ -0,0 +1,13 @@ +namespace CheckDrive.Web.Requests.ManagerReview; + +public class CreateManagerReviewRequest +{ + public int CheckPointId { get; set; } + public int ReviewerId { get; set; } + public string? Notes { get; set; } + public decimal InitialMillage { get; set; } + public decimal FinalMillage { get; set; } + public decimal FuelConsumption { get; set; } + public decimal RemainingFuelAmount { get; set; } + public decimal DebtAmount { get; set; } +} \ No newline at end of file diff --git a/CheckDrive.Web/CheckDrive.Web/Requests/OilMark/CreateOilMarkRequest.cs b/CheckDrive.Web/CheckDrive.Web/Requests/OilMark/CreateOilMarkRequest.cs index 38b85248..5d4e736f 100644 --- a/CheckDrive.Web/CheckDrive.Web/Requests/OilMark/CreateOilMarkRequest.cs +++ b/CheckDrive.Web/CheckDrive.Web/Requests/OilMark/CreateOilMarkRequest.cs @@ -1,6 +1,10 @@ -namespace CheckDrive.Web.Requests.OilMark; +using System.ComponentModel.DataAnnotations; + +namespace CheckDrive.Web.Requests.OilMark; public class CreateOilMarkRequest { + [Required(ErrorMessage = "Yoqilg'i nomi majburiy.")] + [StringLength(25, MinimumLength = 2, ErrorMessage = "Belgilar soni 2 va 25 orasida bo'lishi kerak")] public required string Name { get; set; } } diff --git a/CheckDrive.Web/CheckDrive.Web/Responses/GetAccountResponse.cs b/CheckDrive.Web/CheckDrive.Web/Responses/GetAccountResponse.cs deleted file mode 100644 index 6b71b12c..00000000 --- a/CheckDrive.Web/CheckDrive.Web/Responses/GetAccountResponse.cs +++ /dev/null @@ -1,8 +0,0 @@ -using CheckDrive.ApiContracts.Account; - -namespace CheckDrive.Web.Responses -{ - public class GetAccountResponse : GetBaseResponse<AccountDto> - { - } -} diff --git a/CheckDrive.Web/CheckDrive.Web/Responses/GetBaseResponse.cs b/CheckDrive.Web/CheckDrive.Web/Responses/GetBaseResponse.cs deleted file mode 100644 index c6dce540..00000000 --- a/CheckDrive.Web/CheckDrive.Web/Responses/GetBaseResponse.cs +++ /dev/null @@ -1,13 +0,0 @@ -namespace CheckDrive.Web.Responses -{ - public abstract class GetBaseResponse<T> - { - public IEnumerable<T>? Data { get; set; } - public int PageNumber { get; set; } - public int PageSize { get; set; } - public bool HasNextPage { get; set; } - public bool HasPreviousPage { get; set; } - public int TotalPages { get; set; } - public int TotalCount { get; set; } - } -} diff --git a/CheckDrive.Web/CheckDrive.Web/Responses/GetCarHistoryResponse.cs b/CheckDrive.Web/CheckDrive.Web/Responses/GetCarHistoryResponse.cs deleted file mode 100644 index 31f291ad..00000000 --- a/CheckDrive.Web/CheckDrive.Web/Responses/GetCarHistoryResponse.cs +++ /dev/null @@ -1,8 +0,0 @@ -using CheckDrive.ApiContracts.Car; - -namespace CheckDrive.Web.Responses -{ - public class GetCarHistoryResponse : GetBaseResponse<CarHistoryDto> - { - } -} diff --git a/CheckDrive.Web/CheckDrive.Web/Responses/GetCarResponse.cs b/CheckDrive.Web/CheckDrive.Web/Responses/GetCarResponse.cs deleted file mode 100644 index bc34388a..00000000 --- a/CheckDrive.Web/CheckDrive.Web/Responses/GetCarResponse.cs +++ /dev/null @@ -1,8 +0,0 @@ -using CheckDrive.ApiContracts.Car; - -namespace CheckDrive.Web.Responses -{ - public class GetCarResponse : GetBaseResponse<CarDto> - { - } -} diff --git a/CheckDrive.Web/CheckDrive.Web/Responses/GetDispatcherResponse.cs b/CheckDrive.Web/CheckDrive.Web/Responses/GetDispatcherResponse.cs deleted file mode 100644 index adbe187f..00000000 --- a/CheckDrive.Web/CheckDrive.Web/Responses/GetDispatcherResponse.cs +++ /dev/null @@ -1,8 +0,0 @@ -using CheckDrive.ApiContracts.Dispatcher; - -namespace CheckDrive.Web.Responses -{ - public class GetDispatcherResponse : GetBaseResponse<DispatcherDto> - { - } -} \ No newline at end of file diff --git a/CheckDrive.Web/CheckDrive.Web/Responses/GetDispatcherReviewResponse.cs b/CheckDrive.Web/CheckDrive.Web/Responses/GetDispatcherReviewResponse.cs deleted file mode 100644 index 07fffa79..00000000 --- a/CheckDrive.Web/CheckDrive.Web/Responses/GetDispatcherReviewResponse.cs +++ /dev/null @@ -1,8 +0,0 @@ -using CheckDrive.ApiContracts.DispatcherReview; - -namespace CheckDrive.Web.Responses -{ - public class GetDispatcherReviewResponse : GetBaseResponse<DispatcherReviewDto> - { - } -} diff --git a/CheckDrive.Web/CheckDrive.Web/Responses/GetDoctorResponse.cs b/CheckDrive.Web/CheckDrive.Web/Responses/GetDoctorResponse.cs deleted file mode 100644 index d33b8591..00000000 --- a/CheckDrive.Web/CheckDrive.Web/Responses/GetDoctorResponse.cs +++ /dev/null @@ -1,8 +0,0 @@ -using CheckDrive.ApiContracts.Doctor; - -namespace CheckDrive.Web.Responses -{ - public class GetDoctorResponse : GetBaseResponse<DoctorDto> - { - } -} diff --git a/CheckDrive.Web/CheckDrive.Web/Responses/GetDoctorReviewResponse.cs b/CheckDrive.Web/CheckDrive.Web/Responses/GetDoctorReviewResponse.cs deleted file mode 100644 index df295481..00000000 --- a/CheckDrive.Web/CheckDrive.Web/Responses/GetDoctorReviewResponse.cs +++ /dev/null @@ -1,9 +0,0 @@ -using CheckDrive.ApiContracts.DoctorReview; -using CheckDrive.Web.Models; - -namespace CheckDrive.Web.Responses -{ - public class GetDoctorReviewResponse : GetBaseResponse<DoctorReviewDto> - { - } -} diff --git a/CheckDrive.Web/CheckDrive.Web/Responses/GetDriverResponse.cs b/CheckDrive.Web/CheckDrive.Web/Responses/GetDriverResponse.cs deleted file mode 100644 index 5defe9f3..00000000 --- a/CheckDrive.Web/CheckDrive.Web/Responses/GetDriverResponse.cs +++ /dev/null @@ -1,8 +0,0 @@ -using CheckDrive.ApiContracts.Driver; - -namespace CheckDrive.Web.Responses -{ - public class GetDriverResponse : GetBaseResponse<DriverDto> - { - } -} diff --git a/CheckDrive.Web/CheckDrive.Web/Responses/GetMechanicAcceptanceResponse.cs b/CheckDrive.Web/CheckDrive.Web/Responses/GetMechanicAcceptanceResponse.cs deleted file mode 100644 index 26b37d3b..00000000 --- a/CheckDrive.Web/CheckDrive.Web/Responses/GetMechanicAcceptanceResponse.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace CheckDrive.Web.Responses -{ - public class GetMechanicAcceptanceResponse : GetBaseResponse<ApiContracts.MechanicAcceptance.MechanicAcceptanceDto> - { - } -} diff --git a/CheckDrive.Web/CheckDrive.Web/Responses/GetMechanicHandoverResponse.cs b/CheckDrive.Web/CheckDrive.Web/Responses/GetMechanicHandoverResponse.cs deleted file mode 100644 index 246ad6d0..00000000 --- a/CheckDrive.Web/CheckDrive.Web/Responses/GetMechanicHandoverResponse.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace CheckDrive.Web.Responses -{ - public class GetMechanicHandoverResponse : GetBaseResponse<ApiContracts.MechanicHandover.MechanicHandoverDto> - { - } -} diff --git a/CheckDrive.Web/CheckDrive.Web/Responses/GetMechanicResponse.cs b/CheckDrive.Web/CheckDrive.Web/Responses/GetMechanicResponse.cs deleted file mode 100644 index d1360c70..00000000 --- a/CheckDrive.Web/CheckDrive.Web/Responses/GetMechanicResponse.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace CheckDrive.Web.Responses -{ - public class GetMechanicResponse : GetBaseResponse<ApiContracts.Mechanic.MechanicDto> - { - } -} diff --git a/CheckDrive.Web/CheckDrive.Web/Responses/GetOilMarkResponse.cs b/CheckDrive.Web/CheckDrive.Web/Responses/GetOilMarkResponse.cs deleted file mode 100644 index 3fbe3e50..00000000 --- a/CheckDrive.Web/CheckDrive.Web/Responses/GetOilMarkResponse.cs +++ /dev/null @@ -1,8 +0,0 @@ -using CheckDrive.ApiContracts.OilMark; - -namespace CheckDrive.Web.Responses -{ - public class GetOilMarkResponse : GetBaseResponse<OilMarkDto> - { - } -} diff --git a/CheckDrive.Web/CheckDrive.Web/Responses/GetOperatorResponse.cs b/CheckDrive.Web/CheckDrive.Web/Responses/GetOperatorResponse.cs deleted file mode 100644 index e9a6ae3a..00000000 --- a/CheckDrive.Web/CheckDrive.Web/Responses/GetOperatorResponse.cs +++ /dev/null @@ -1,9 +0,0 @@ -using CheckDrive.ApiContracts.Operator; -using CheckDrive.Web.Models; - -namespace CheckDrive.Web.Responses -{ - public class GetOperatorResponse : GetBaseResponse<OperatorDto> - { - } -} diff --git a/CheckDrive.Web/CheckDrive.Web/Responses/GetOperatorReviewResponse.cs b/CheckDrive.Web/CheckDrive.Web/Responses/GetOperatorReviewResponse.cs deleted file mode 100644 index 8bb67a89..00000000 --- a/CheckDrive.Web/CheckDrive.Web/Responses/GetOperatorReviewResponse.cs +++ /dev/null @@ -1,8 +0,0 @@ -using CheckDrive.ApiContracts.OperatorReview; - -namespace CheckDrive.Web.Responses -{ - public class GetOperatorReviewResponse : GetBaseResponse<OperatorReviewDto> - { - } -} diff --git a/CheckDrive.Web/CheckDrive.Web/Responses/GetRoleResponse.cs b/CheckDrive.Web/CheckDrive.Web/Responses/GetRoleResponse.cs deleted file mode 100644 index a8c5d5ec..00000000 --- a/CheckDrive.Web/CheckDrive.Web/Responses/GetRoleResponse.cs +++ /dev/null @@ -1,9 +0,0 @@ -using CheckDrive.ApiContracts.Role; -using CheckDrive.Web.Models; - -namespace CheckDrive.Web.Responses -{ - public class GetRoleResponse : GetBaseResponse<RoleDto> - { - } -} diff --git a/CheckDrive.Web/CheckDrive.Web/Responses/GetTechnicianResponse.cs b/CheckDrive.Web/CheckDrive.Web/Responses/GetTechnicianResponse.cs deleted file mode 100644 index 15693876..00000000 --- a/CheckDrive.Web/CheckDrive.Web/Responses/GetTechnicianResponse.cs +++ /dev/null @@ -1,8 +0,0 @@ -using CheckDrive.Web.Models; - -namespace CheckDrive.Web.Responses -{ - public class GetTechnicianResponse : GetBaseResponse<Technician> - { - } -} diff --git a/CheckDrive.Web/CheckDrive.Web/Services/CurrentUserService/CurrentUserService.cs b/CheckDrive.Web/CheckDrive.Web/Services/CurrentUserService/CurrentUserService.cs index 6b9a3391..3363b82f 100644 --- a/CheckDrive.Web/CheckDrive.Web/Services/CurrentUserService/CurrentUserService.cs +++ b/CheckDrive.Web/CheckDrive.Web/Services/CurrentUserService/CurrentUserService.cs @@ -3,30 +3,18 @@ namespace CheckDrive.Web.Services.CurrentUserService; -internal sealed class CurrentUserService : ICurrentUserService +internal sealed class CurrentUserService(ICookieHandler cookieHandler) : ICurrentUserService { - private readonly ICookieHandler _cookieHandler; - - public CurrentUserService(ICookieHandler cookieHandler) + public int GetUserId() { - _cookieHandler = cookieHandler ?? throw new ArgumentNullException(nameof(cookieHandler)); - } - - public string GetUserId() - { - var (accessToken, _) = _cookieHandler.GetTokens(); - - if (string.IsNullOrEmpty(accessToken)) - { - return string.Empty; - } + var (accessToken, _) = cookieHandler.GetTokens(); - return JwtHelper.GetUserId(accessToken); + return JwtHelper.GetUserId(accessToken ?? string.Empty); } public string GetAccountId() { - var (accessToken, _) = _cookieHandler.GetTokens(); + var (accessToken, _) = cookieHandler.GetTokens(); if (string.IsNullOrEmpty(accessToken)) { @@ -38,7 +26,7 @@ public string GetAccountId() public string GetRole() { - var (accessToken, _) = _cookieHandler.GetTokens(); + var (accessToken, _) = cookieHandler.GetTokens(); if (string.IsNullOrEmpty(accessToken)) { diff --git a/CheckDrive.Web/CheckDrive.Web/Services/CurrentUserService/ICurrentUserService.cs b/CheckDrive.Web/CheckDrive.Web/Services/CurrentUserService/ICurrentUserService.cs index c1b28017..b8a5bc2d 100644 --- a/CheckDrive.Web/CheckDrive.Web/Services/CurrentUserService/ICurrentUserService.cs +++ b/CheckDrive.Web/CheckDrive.Web/Services/CurrentUserService/ICurrentUserService.cs @@ -2,7 +2,7 @@ public interface ICurrentUserService { - string GetUserId(); + int GetUserId(); string GetAccountId(); string GetRole(); } diff --git a/CheckDrive.Web/CheckDrive.Web/Stores/Accounts/AccountDataStore.cs b/CheckDrive.Web/CheckDrive.Web/Stores/Accounts/AccountDataStore.cs deleted file mode 100644 index ac3c765f..00000000 --- a/CheckDrive.Web/CheckDrive.Web/Stores/Accounts/AccountDataStore.cs +++ /dev/null @@ -1,64 +0,0 @@ -using CheckDrive.ApiContracts.Account; -using CheckDrive.ApiContracts.DispatcherReview; -using CheckDrive.ApiContracts.DoctorReview; -using CheckDrive.ApiContracts.Mechanic; -using CheckDrive.ApiContracts.OperatorReview; -using CheckDrive.Web.Responses; -using CheckDrive.Web.Services; - -namespace CheckDrive.Web.Stores.Accounts; - -public class AccountDataStore : IAccountDataStore -{ - private readonly CheckDriveApi _api; - - public AccountDataStore(CheckDriveApi apiClient) - { - _api = apiClient; - } - - public Task<AccountDto> CreateAccountAsync(AccountForCreateDto account) - { - throw new NotImplementedException(); - } - - public Task DeleteAccountAsync(int id) - { - throw new NotImplementedException(); - } - - public Task<AccountDto> GetAccountAsync(int id) - { - throw new NotImplementedException(); - } - - public Task<GetAccountResponse> GetAccountsAsync(string? searchString, int? roleId, DateTime? birthDate, int? pageNumber) - { - throw new NotImplementedException(); - } - - public Task<IEnumerable<DispatcherReviewDto>> GetDispatcherHistories(int Id) - { - throw new NotImplementedException(); - } - - public Task<IEnumerable<DoctorReviewDto>> GetDoctorHistories(int Id) - { - throw new NotImplementedException(); - } - - public Task<IEnumerable<MechanicHistororiesDto>> GetMechanicHistories(int Id) - { - throw new NotImplementedException(); - } - - public Task<IEnumerable<OperatorReviewDto>> GetOperatorHistories(int Id) - { - throw new NotImplementedException(); - } - - public Task<AccountDto> UpdateAccountAsync(int id, AccountForUpdateDto account) - { - throw new NotImplementedException(); - } -} diff --git a/CheckDrive.Web/CheckDrive.Web/Stores/Accounts/IAccountDataStore.cs b/CheckDrive.Web/CheckDrive.Web/Stores/Accounts/IAccountDataStore.cs deleted file mode 100644 index 2c3477fd..00000000 --- a/CheckDrive.Web/CheckDrive.Web/Stores/Accounts/IAccountDataStore.cs +++ /dev/null @@ -1,22 +0,0 @@ -using CheckDrive.ApiContracts.Account; -using CheckDrive.ApiContracts.DispatcherReview; -using CheckDrive.ApiContracts.DoctorReview; -using CheckDrive.ApiContracts.Mechanic; -using CheckDrive.ApiContracts.OperatorReview; -using CheckDrive.Web.Responses; - -namespace CheckDrive.Web.Stores.Accounts -{ - public interface IAccountDataStore - { - Task<GetAccountResponse> GetAccountsAsync(string? searchString, int? roleId, DateTime? birthDate, int? pageNumber); - Task<AccountDto> GetAccountAsync(int id); - Task<AccountDto> CreateAccountAsync(AccountForCreateDto account); - Task<AccountDto> UpdateAccountAsync(int id, AccountForUpdateDto account); - Task DeleteAccountAsync(int id); - Task<IEnumerable<DoctorReviewDto>> GetDoctorHistories(int Id); - Task<IEnumerable<OperatorReviewDto>> GetOperatorHistories(int Id); - Task<IEnumerable<MechanicHistororiesDto>> GetMechanicHistories(int Id); - Task<IEnumerable<DispatcherReviewDto>> GetDispatcherHistories(int Id); - } -} diff --git a/CheckDrive.Web/CheckDrive.Web/Stores/CheckPoint/CheckPointStore.cs b/CheckDrive.Web/CheckDrive.Web/Stores/CheckPoint/CheckPointStore.cs index 8ce5155d..2ffd0903 100644 --- a/CheckDrive.Web/CheckDrive.Web/Stores/CheckPoint/CheckPointStore.cs +++ b/CheckDrive.Web/CheckDrive.Web/Stores/CheckPoint/CheckPointStore.cs @@ -12,13 +12,11 @@ internal sealed class CheckPointStore(CheckDriveApi apiClient) : ICheckPointStor public Task<List<CheckPointViewModel>> GetAllAsync() => apiClient.GetAsync<List<CheckPointViewModel>>(_resourceUrl); - public async Task<CheckPointViewModel> GetCheckPointByIdAsync(int id) + public async Task<CheckPointViewModel> GetByIdAsync(int id) { - var checkPoints = await apiClient.GetAsync<List<CheckPointViewModel>>(_resourceUrl); + var checkPoint = await apiClient.GetAsync<CheckPointViewModel>($"{_resourceUrl}/{id}"); - var result = checkPoints.FirstOrDefault(x => x.Id == id); - - return result; + return checkPoint; } public List<SelectListItem> GetEnumValues<TEnum>() where TEnum : Enum diff --git a/CheckDrive.Web/CheckDrive.Web/Stores/CheckPoint/ICheckPointStore.cs b/CheckDrive.Web/CheckDrive.Web/Stores/CheckPoint/ICheckPointStore.cs index 700eac0c..9a265ec8 100644 --- a/CheckDrive.Web/CheckDrive.Web/Stores/CheckPoint/ICheckPointStore.cs +++ b/CheckDrive.Web/CheckDrive.Web/Stores/CheckPoint/ICheckPointStore.cs @@ -6,6 +6,6 @@ namespace CheckDrive.Web.Stores.CheckPoint; public interface ICheckPointStore { Task<List<CheckPointViewModel>> GetAllAsync(); - Task<CheckPointViewModel> GetCheckPointByIdAsync(int id); + Task<CheckPointViewModel> GetByIdAsync(int id); List<SelectListItem> GetEnumValues<TEnum>() where TEnum : Enum; } diff --git a/CheckDrive.Web/CheckDrive.Web/Stores/Debts/DebtsStore.cs b/CheckDrive.Web/CheckDrive.Web/Stores/Debts/DebtsStore.cs index 1c5fb286..38c7dc6f 100644 --- a/CheckDrive.Web/CheckDrive.Web/Stores/Debts/DebtsStore.cs +++ b/CheckDrive.Web/CheckDrive.Web/Stores/Debts/DebtsStore.cs @@ -4,24 +4,19 @@ namespace CheckDrive.Web.Stores.Debts; -internal sealed class DebtsStore : IDebtsStore +internal sealed class DebtsStore(CheckDriveApi apiClient) : IDebtsStore { private static readonly string resourceUrl = "debts"; - private readonly CheckDriveApi _apiClient; - public DebtsStore(CheckDriveApi apiClient) - { - _apiClient = apiClient ?? throw new ArgumentNullException(nameof(apiClient)); - } public Task<List<DebtViewModel>> GetAsync() - =>_apiClient.GetAsync<List<DebtViewModel>>(resourceUrl); - + => apiClient.GetAsync<List<DebtViewModel>>(resourceUrl); + public Task<DebtViewModel> GetByIdAsync(int id) - => _apiClient.GetAsync<DebtViewModel>($"{resourceUrl}/{id}"); + => apiClient.GetAsync<DebtViewModel>($"{resourceUrl}/{id}"); public Task UpdateAsync(UpdateDebtRequest request) - =>_apiClient.PutAsync($"{resourceUrl}/{request.Id}", request); + => apiClient.PutAsync($"{resourceUrl}/{request.Id}", request); public Task DeleteAsync(int id) - => _apiClient.DeleteAsync($"{resourceUrl}/{id}"); + => apiClient.DeleteAsync($"{resourceUrl}/{id}"); } diff --git a/CheckDrive.Web/CheckDrive.Web/Stores/DispatcherReviews/DispatcherReviewDataStore.cs b/CheckDrive.Web/CheckDrive.Web/Stores/DispatcherReviews/DispatcherReviewDataStore.cs deleted file mode 100644 index 9cb7336f..00000000 --- a/CheckDrive.Web/CheckDrive.Web/Stores/DispatcherReviews/DispatcherReviewDataStore.cs +++ /dev/null @@ -1,45 +0,0 @@ -using CheckDrive.ApiContracts.DispatcherReview; -using CheckDrive.Web.Responses; -using CheckDrive.Web.Services; - -namespace CheckDrive.Web.Stores.DispatcherReviews; - -public class DispatcherReviewDataStore : IDispatcherReviewDataStore -{ - private readonly CheckDriveApi _apiClient; - - public DispatcherReviewDataStore(CheckDriveApi apiClient) - { - _apiClient = apiClient ?? throw new ArgumentNullException(nameof(apiClient)); - } - - public Task<DispatcherReviewDto> CreateDispatcherReview(DispatcherReviewForCreateDto review) - { - throw new NotImplementedException(); - } - - public Task DeleteDispatcherReview(int id) - { - throw new NotImplementedException(); - } - - public Task<DispatcherReviewDto> GetDispatcherReview(int id) - { - throw new NotImplementedException(); - } - - public Task<GetDispatcherReviewResponse> GetDispatcherReviews(int? pageNumber, string? searchString, DateTime? date, int? roleId, int? accountId) - { - throw new NotImplementedException(); - } - - public Task<Stream> GetExportFile(int year, int month) - { - throw new NotImplementedException(); - } - - public Task<DispatcherReviewDto> UpdateDispatcherReview(int id, DispatcherReviewForUpdateDto review) - { - throw new NotImplementedException(); - } -} diff --git a/CheckDrive.Web/CheckDrive.Web/Stores/DispatcherReviews/IDispatcherReviewDataStore.cs b/CheckDrive.Web/CheckDrive.Web/Stores/DispatcherReviews/IDispatcherReviewDataStore.cs deleted file mode 100644 index 2f51f60e..00000000 --- a/CheckDrive.Web/CheckDrive.Web/Stores/DispatcherReviews/IDispatcherReviewDataStore.cs +++ /dev/null @@ -1,15 +0,0 @@ -using CheckDrive.ApiContracts.DispatcherReview; -using CheckDrive.Web.Responses; - -namespace CheckDrive.Web.Stores.DispatcherReviews -{ - public interface IDispatcherReviewDataStore - { - Task<GetDispatcherReviewResponse> GetDispatcherReviews(int? pageNumber, string? searchString, DateTime? date, int? roleId, int? accountId); - Task<DispatcherReviewDto> GetDispatcherReview(int id); - Task<DispatcherReviewDto> CreateDispatcherReview(DispatcherReviewForCreateDto review); - Task<DispatcherReviewDto> UpdateDispatcherReview(int id, DispatcherReviewForUpdateDto review); - Task DeleteDispatcherReview(int id); - Task<Stream> GetExportFile(int year, int month); - } -} diff --git a/CheckDrive.Web/CheckDrive.Web/Stores/Dispatchers/DispatcherDataStore.cs b/CheckDrive.Web/CheckDrive.Web/Stores/Dispatchers/DispatcherDataStore.cs deleted file mode 100644 index 76b4129e..00000000 --- a/CheckDrive.Web/CheckDrive.Web/Stores/Dispatchers/DispatcherDataStore.cs +++ /dev/null @@ -1,24 +0,0 @@ -using CheckDrive.Web.Responses; -using CheckDrive.Web.Services; - -namespace CheckDrive.Web.Stores.Dispatchers; - -public class DispatcherDataStore : IDispatcherDataStore -{ - private readonly CheckDriveApi _apiClient; - - public DispatcherDataStore(CheckDriveApi apiClient) - { - _apiClient = apiClient; - } - - public Task<GetDispatcherResponse> GetDispatchers(int? accountId, int? roleId) - { - throw new NotImplementedException(); - } - - public Task<GetDispatcherResponse> GetDispatchers() - { - throw new NotImplementedException(); - } -} diff --git a/CheckDrive.Web/CheckDrive.Web/Stores/Dispatchers/IDispatcherDataStore.cs b/CheckDrive.Web/CheckDrive.Web/Stores/Dispatchers/IDispatcherDataStore.cs deleted file mode 100644 index 29d4bed8..00000000 --- a/CheckDrive.Web/CheckDrive.Web/Stores/Dispatchers/IDispatcherDataStore.cs +++ /dev/null @@ -1,10 +0,0 @@ -using CheckDrive.Web.Responses; - -namespace CheckDrive.Web.Stores.Dispatchers -{ - public interface IDispatcherDataStore - { - Task<GetDispatcherResponse> GetDispatchers(int? accountId, int? roleId); - Task<GetDispatcherResponse> GetDispatchers(); - } -} diff --git a/CheckDrive.Web/CheckDrive.Web/Stores/DoctorReviews/DoctorReviewDataStore.cs b/CheckDrive.Web/CheckDrive.Web/Stores/DoctorReviews/DoctorReviewDataStore.cs deleted file mode 100644 index 257a2a6b..00000000 --- a/CheckDrive.Web/CheckDrive.Web/Stores/DoctorReviews/DoctorReviewDataStore.cs +++ /dev/null @@ -1,45 +0,0 @@ -using CheckDrive.ApiContracts.DoctorReview; -using CheckDrive.Web.Responses; -using CheckDrive.Web.Services; - -namespace CheckDrive.Web.Stores.DoctorReviews; - -public class DoctorReviewDataStore : IDoctorReviewDataStore -{ - private readonly CheckDriveApi _apiClient; - - public DoctorReviewDataStore(CheckDriveApi apiClient) - { - _apiClient = apiClient; - } - - public Task<DoctorReviewDto> CreateDoctorReviewAsync(DoctorReviewForCreateDto review) - { - throw new NotImplementedException(); - } - - public Task DeleteDoctorReviewAsync(int id) - { - throw new NotImplementedException(); - } - - public Task<DoctorReviewDto> GetDoctorReviewAsync(int id) - { - throw new NotImplementedException(); - } - - public Task<GetDoctorReviewResponse> GetDoctorReviewsAsync(int? pageNumber, string? searchString, DateTime? date, bool? isHealthy, int? roleId, int? accountID) - { - throw new NotImplementedException(); - } - - public Task<IEnumerable<DoctorReviewDto>>? GetTodayReviewsAsync() - { - throw new NotImplementedException(); - } - - public Task<DoctorReviewDto> UpdateDoctorReviewAsync(int id, DoctorReviewForUpdateDto review) - { - throw new NotImplementedException(); - } -} diff --git a/CheckDrive.Web/CheckDrive.Web/Stores/DoctorReviews/IDoctorReviewDataStore.cs b/CheckDrive.Web/CheckDrive.Web/Stores/DoctorReviews/IDoctorReviewDataStore.cs deleted file mode 100644 index 1d840e38..00000000 --- a/CheckDrive.Web/CheckDrive.Web/Stores/DoctorReviews/IDoctorReviewDataStore.cs +++ /dev/null @@ -1,15 +0,0 @@ -using CheckDrive.ApiContracts.DoctorReview; -using CheckDrive.Web.Responses; - -namespace CheckDrive.Web.Stores.DoctorReviews -{ - public interface IDoctorReviewDataStore - { - Task<GetDoctorReviewResponse> GetDoctorReviewsAsync(int? pageNumber, string? searchString, DateTime? date, bool? isHealthy, int? roleId, int? accountID); - Task<IEnumerable<DoctorReviewDto>>? GetTodayReviewsAsync(); - Task<DoctorReviewDto> GetDoctorReviewAsync(int id); - Task<DoctorReviewDto> CreateDoctorReviewAsync(DoctorReviewForCreateDto review); - Task<DoctorReviewDto> UpdateDoctorReviewAsync(int id, DoctorReviewForUpdateDto review); - Task DeleteDoctorReviewAsync(int id); - } -} diff --git a/CheckDrive.Web/CheckDrive.Web/Stores/Doctors/DoctorDataStore.cs b/CheckDrive.Web/CheckDrive.Web/Stores/Doctors/DoctorDataStore.cs deleted file mode 100644 index 34e9e840..00000000 --- a/CheckDrive.Web/CheckDrive.Web/Stores/Doctors/DoctorDataStore.cs +++ /dev/null @@ -1,46 +0,0 @@ -using CheckDrive.ApiContracts.Account; -using CheckDrive.ApiContracts.Doctor; -using CheckDrive.Web.Responses; -using CheckDrive.Web.Services; - -namespace CheckDrive.Web.Stores.Doctors; - -public class DoctorDataStore : IDoctorDataStore -{ - private readonly CheckDriveApi _apiClient; - - public DoctorDataStore(CheckDriveApi apiClient) - { - _apiClient = apiClient; - } - - public Task<DoctorDto> CreateDoctor(DoctorForCreateDto doctorForCreate) - { - throw new NotImplementedException(); - } - - public Task DeleteDoctor(int id) - { - throw new NotImplementedException(); - } - - public Task<DoctorDto> GetDoctor(int id) - { - throw new NotImplementedException(); - } - - public Task<GetDoctorResponse> GetDoctors(int accountId) - { - throw new NotImplementedException(); - } - - public Task<GetDoctorResponse> GetDoctors() - { - throw new NotImplementedException(); - } - - public Task<DoctorDto> UpdateDoctor(int id, AccountForUpdateDto doctorForUpdate) - { - throw new NotImplementedException(); - } -} diff --git a/CheckDrive.Web/CheckDrive.Web/Stores/Doctors/IDoctorsDataStore.cs b/CheckDrive.Web/CheckDrive.Web/Stores/Doctors/IDoctorsDataStore.cs deleted file mode 100644 index 8cfebae3..00000000 --- a/CheckDrive.Web/CheckDrive.Web/Stores/Doctors/IDoctorsDataStore.cs +++ /dev/null @@ -1,16 +0,0 @@ -using CheckDrive.ApiContracts.Account; -using CheckDrive.ApiContracts.Doctor; -using CheckDrive.Web.Responses; - -namespace CheckDrive.Web.Stores.Doctors -{ - public interface IDoctorDataStore - { - Task<GetDoctorResponse> GetDoctors(int accountId); - Task<GetDoctorResponse> GetDoctors(); - Task<DoctorDto> GetDoctor(int id); - Task<DoctorDto> CreateDoctor(DoctorForCreateDto doctorForCreate); - Task<DoctorDto> UpdateDoctor(int id, AccountForUpdateDto doctorForUpdate); - Task DeleteDoctor(int id); - } -} diff --git a/CheckDrive.Web/CheckDrive.Web/Stores/Drivers/DriverDataStore.cs b/CheckDrive.Web/CheckDrive.Web/Stores/Drivers/DriverDataStore.cs deleted file mode 100644 index 08d535b4..00000000 --- a/CheckDrive.Web/CheckDrive.Web/Stores/Drivers/DriverDataStore.cs +++ /dev/null @@ -1,51 +0,0 @@ -using CheckDrive.ApiContracts.Account; -using CheckDrive.ApiContracts.Driver; -using CheckDrive.Web.Responses; -using CheckDrive.Web.Services; - -namespace CheckDrive.Web.Stores.Drivers; - -public class DriverDataStore : IDriverDataStore -{ - private readonly CheckDriveApi _apiClient; - - public DriverDataStore(CheckDriveApi apiClient) - { - _apiClient = apiClient; - } - - public Task<DriverDto> CreateDriverAsync(DriverForCreateDto driverForCreate) - { - throw new NotImplementedException(); - } - - public Task DeleteDriverAsync(int id) - { - throw new NotImplementedException(); - } - - public Task<DriverDto> GetDriverAsync(int id) - { - throw new NotImplementedException(); - } - - public Task<IEnumerable<DriverHistoryDto>> GetDriverHistories(int Id) - { - throw new NotImplementedException(); - } - - public Task<GetDriverResponse> GetDriversAsync(string? searchString, int? pageNumber) - { - throw new NotImplementedException(); - } - - public Task<GetDriverResponse> GetDriversAsync(int? roleId, bool? isBusy) - { - throw new NotImplementedException(); - } - - public Task<DriverDto> UpdateDriverAsync(int id, AccountForUpdateDto driverForUpdate) - { - throw new NotImplementedException(); - } -} diff --git a/CheckDrive.Web/CheckDrive.Web/Stores/Drivers/IDriverDataStore.cs b/CheckDrive.Web/CheckDrive.Web/Stores/Drivers/IDriverDataStore.cs deleted file mode 100644 index 5226ac59..00000000 --- a/CheckDrive.Web/CheckDrive.Web/Stores/Drivers/IDriverDataStore.cs +++ /dev/null @@ -1,17 +0,0 @@ -using CheckDrive.ApiContracts.Account; -using CheckDrive.ApiContracts.Driver; -using CheckDrive.Web.Responses; - -namespace CheckDrive.Web.Stores.Drivers -{ - public interface IDriverDataStore - { - Task<GetDriverResponse> GetDriversAsync(string? searchString,int? pageNumber); - Task<GetDriverResponse> GetDriversAsync(int? roleId, bool? isBusy); - Task<DriverDto> GetDriverAsync(int id); - Task<IEnumerable<DriverHistoryDto>> GetDriverHistories(int Id); - Task<DriverDto> CreateDriverAsync(DriverForCreateDto driverForCreate); - Task<DriverDto> UpdateDriverAsync(int id, AccountForUpdateDto driverForUpdate); - Task DeleteDriverAsync(int id); - } -} diff --git a/CheckDrive.Web/CheckDrive.Web/Stores/ManagerReview/IManagerReviewStore.cs b/CheckDrive.Web/CheckDrive.Web/Stores/ManagerReview/IManagerReviewStore.cs new file mode 100644 index 00000000..5631a1be --- /dev/null +++ b/CheckDrive.Web/CheckDrive.Web/Stores/ManagerReview/IManagerReviewStore.cs @@ -0,0 +1,9 @@ +using CheckDrive.Web.Requests.ManagerReview; +using CheckDrive.Web.ViewModels.CheckPoint; + +namespace CheckDrive.Web.Stores.ManagerReview; + +public interface IManagerReviewStore +{ + Task<CheckPointViewModel> CreateAsync(CreateManagerReviewRequest request); +} diff --git a/CheckDrive.Web/CheckDrive.Web/Stores/ManagerReview/ManagerReviewStore.cs b/CheckDrive.Web/CheckDrive.Web/Stores/ManagerReview/ManagerReviewStore.cs new file mode 100644 index 00000000..b4f922fd --- /dev/null +++ b/CheckDrive.Web/CheckDrive.Web/Stores/ManagerReview/ManagerReviewStore.cs @@ -0,0 +1,13 @@ +using CheckDrive.Web.Requests.ManagerReview; +using CheckDrive.Web.Services; +using CheckDrive.Web.ViewModels.CheckPoint; + +namespace CheckDrive.Web.Stores.ManagerReview; + +public class ManagerReviewStore(CheckDriveApi apiClient) : IManagerReviewStore +{ + private static readonly string resourceUrl = "reviews/managers"; + + public Task<CheckPointViewModel> CreateAsync(CreateManagerReviewRequest request) => + apiClient.PostAsync<CreateManagerReviewRequest, CheckPointViewModel>($"{resourceUrl}/46", request); +} diff --git a/CheckDrive.Web/CheckDrive.Web/Stores/MechanicAcceptances/IMechanicAcceptanceDataStore.cs b/CheckDrive.Web/CheckDrive.Web/Stores/MechanicAcceptances/IMechanicAcceptanceDataStore.cs deleted file mode 100644 index fba7ccc3..00000000 --- a/CheckDrive.Web/CheckDrive.Web/Stores/MechanicAcceptances/IMechanicAcceptanceDataStore.cs +++ /dev/null @@ -1,18 +0,0 @@ -using CheckDrive.ApiContracts.MechanicAcceptance; -using CheckDrive.Web.Constants; -using CheckDrive.Web.Responses; - -namespace CheckDrive.Web.Stores.MechanicAcceptances -{ - public interface IMechanicAcceptanceDataStore - { - Task<GetMechanicAcceptanceResponse> GetMechanicAcceptancesAsync(int? pageNumber, string? searchString, DateTime? date, string? status, int? roleId); - Task<GetMechanicAcceptanceResponse> GetMechanicAcceptancesAsync(int? pageNumber, string? searchString, DateTime? date, int? accountId); - Task<GetMechanicAcceptanceResponse> GetMechanicAcceptancesAsync(); - Task<MechanicAcceptanceDto> GetMechanicAcceptanceAsync(int id); - Task<MechanicAcceptanceDto> CreateMechanicAcceptanceAsync(MechanicAcceptanceForCreateDto acceptanceForCreateDto); - Task<MechanicAcceptanceDto> UpdateMechanicAcceptanceAsync(int id, MechanicAcceptanceForUpdateDto mechanicAcceptanceForUpdateDto); - Task DeleteMechanicAcceptanceAsync(int id); - Task<Stream> GetExportFile(int year, int month); - } -} diff --git a/CheckDrive.Web/CheckDrive.Web/Stores/MechanicAcceptances/MechanicAcceptanceDataStore.cs b/CheckDrive.Web/CheckDrive.Web/Stores/MechanicAcceptances/MechanicAcceptanceDataStore.cs deleted file mode 100644 index 5700eb72..00000000 --- a/CheckDrive.Web/CheckDrive.Web/Stores/MechanicAcceptances/MechanicAcceptanceDataStore.cs +++ /dev/null @@ -1,55 +0,0 @@ -using CheckDrive.ApiContracts.MechanicAcceptance; -using CheckDrive.Web.Responses; -using CheckDrive.Web.Services; - -namespace CheckDrive.Web.Stores.MechanicAcceptances; - -public class MechanicAcceptanceDataStore : IMechanicAcceptanceDataStore -{ - private readonly CheckDriveApi _apiClient; - - public MechanicAcceptanceDataStore(CheckDriveApi apiClient) - { - _apiClient = apiClient; - } - - public Task<MechanicAcceptanceDto> CreateMechanicAcceptanceAsync(MechanicAcceptanceForCreateDto acceptanceForCreateDto) - { - throw new NotImplementedException(); - } - - public Task DeleteMechanicAcceptanceAsync(int id) - { - throw new NotImplementedException(); - } - - public Task<Stream> GetExportFile(int year, int month) - { - throw new NotImplementedException(); - } - - public Task<MechanicAcceptanceDto> GetMechanicAcceptanceAsync(int id) - { - throw new NotImplementedException(); - } - - public Task<GetMechanicAcceptanceResponse> GetMechanicAcceptancesAsync(int? pageNumber, string? searchString, DateTime? date, string? status, int? roleId) - { - throw new NotImplementedException(); - } - - public Task<GetMechanicAcceptanceResponse> GetMechanicAcceptancesAsync(int? pageNumber, string? searchString, DateTime? date, int? accountId) - { - throw new NotImplementedException(); - } - - public Task<GetMechanicAcceptanceResponse> GetMechanicAcceptancesAsync() - { - throw new NotImplementedException(); - } - - public Task<MechanicAcceptanceDto> UpdateMechanicAcceptanceAsync(int id, MechanicAcceptanceForUpdateDto mechanicAcceptanceForUpdateDto) - { - throw new NotImplementedException(); - } -} \ No newline at end of file diff --git a/CheckDrive.Web/CheckDrive.Web/Stores/MechanicHandovers/IMechanicHandoverDataStore.cs b/CheckDrive.Web/CheckDrive.Web/Stores/MechanicHandovers/IMechanicHandoverDataStore.cs deleted file mode 100644 index 786739b5..00000000 --- a/CheckDrive.Web/CheckDrive.Web/Stores/MechanicHandovers/IMechanicHandoverDataStore.cs +++ /dev/null @@ -1,17 +0,0 @@ -using CheckDrive.ApiContracts.MechanicHandover; -using CheckDrive.Web.Responses; - -namespace CheckDrive.Web.Stores.MechanicHandovers -{ - public interface IMechanicHandoverDataStore - { - Task<GetMechanicHandoverResponse> GetMechanicHandoversAsync(int? pageNumber, string? searchString, DateTime? date, string? status, int? roleId); - Task<GetMechanicHandoverResponse> GetMechanicHandoversAsync(int? pageNumber, string? searchString, DateTime? date, int? accountId); - Task<GetMechanicHandoverResponse> GetMechanicHandoversAsync(); - Task<MechanicHandoverDto> GetMechanicHandoverAsync(int id); - Task<MechanicHandoverDto> CreateMechanicHandoverAsync(MechanicHandoverForCreateDto mechanicHandoverForCreateDto); - Task<MechanicHandoverDto> UpdateMechanicHandoverAsync(int id, MechanicHandoverForUpdateDto mechanicHandoverForUpdateDto); - Task DeleteMechanicHandoverAsync(int id); - Task<Stream> GetExportFile(int year, int month); - } -} diff --git a/CheckDrive.Web/CheckDrive.Web/Stores/MechanicHandovers/MechanicHandoverDataStore.cs b/CheckDrive.Web/CheckDrive.Web/Stores/MechanicHandovers/MechanicHandoverDataStore.cs deleted file mode 100644 index 195c470d..00000000 --- a/CheckDrive.Web/CheckDrive.Web/Stores/MechanicHandovers/MechanicHandoverDataStore.cs +++ /dev/null @@ -1,55 +0,0 @@ -using CheckDrive.ApiContracts.MechanicHandover; -using CheckDrive.Web.Responses; -using CheckDrive.Web.Services; - -namespace CheckDrive.Web.Stores.MechanicHandovers; - -public class MechanicHandoverDataStore : IMechanicHandoverDataStore -{ - private readonly CheckDriveApi _apiClient; - - public MechanicHandoverDataStore(CheckDriveApi apiClient) - { - _apiClient = apiClient; - } - - public Task<MechanicHandoverDto> CreateMechanicHandoverAsync(MechanicHandoverForCreateDto mechanicHandoverForCreateDto) - { - throw new NotImplementedException(); - } - - public Task DeleteMechanicHandoverAsync(int id) - { - throw new NotImplementedException(); - } - - public Task<Stream> GetExportFile(int year, int month) - { - throw new NotImplementedException(); - } - - public Task<MechanicHandoverDto> GetMechanicHandoverAsync(int id) - { - throw new NotImplementedException(); - } - - public Task<GetMechanicHandoverResponse> GetMechanicHandoversAsync(int? pageNumber, string? searchString, DateTime? date, string? status, int? roleId) - { - throw new NotImplementedException(); - } - - public Task<GetMechanicHandoverResponse> GetMechanicHandoversAsync(int? pageNumber, string? searchString, DateTime? date, int? accountId) - { - throw new NotImplementedException(); - } - - public Task<GetMechanicHandoverResponse> GetMechanicHandoversAsync() - { - throw new NotImplementedException(); - } - - public Task<MechanicHandoverDto> UpdateMechanicHandoverAsync(int id, MechanicHandoverForUpdateDto mechanicHandoverForUpdateDto) - { - throw new NotImplementedException(); - } -} \ No newline at end of file diff --git a/CheckDrive.Web/CheckDrive.Web/Stores/Mechanics/IMechanicDataStore.cs b/CheckDrive.Web/CheckDrive.Web/Stores/Mechanics/IMechanicDataStore.cs deleted file mode 100644 index 553c5f21..00000000 --- a/CheckDrive.Web/CheckDrive.Web/Stores/Mechanics/IMechanicDataStore.cs +++ /dev/null @@ -1,15 +0,0 @@ -using CheckDrive.Web.Models; -using CheckDrive.Web.Responses; - -namespace CheckDrive.Web.Stores.Mechanics -{ - public interface IMechanicDataStore - { - Task<GetMechanicResponse> GetMechanics(int accountId); - Task<GetMechanicResponse> GetMechanicsAsync(); - Task<Mechanic> GetMechanicAsync(int id); - Task<Mechanic> CreateMechanicAsync(Mechanic mechanic); - Task<Mechanic> UpdateMechanicAsync(int id, Mechanic mechanic); - Task DeleteMechanicAsync(int id); - } -} diff --git a/CheckDrive.Web/CheckDrive.Web/Stores/Mechanics/MechanicDataStore.cs b/CheckDrive.Web/CheckDrive.Web/Stores/Mechanics/MechanicDataStore.cs deleted file mode 100644 index 9ec4fedf..00000000 --- a/CheckDrive.Web/CheckDrive.Web/Stores/Mechanics/MechanicDataStore.cs +++ /dev/null @@ -1,45 +0,0 @@ -using CheckDrive.Web.Models; -using CheckDrive.Web.Responses; -using CheckDrive.Web.Services; - -namespace CheckDrive.Web.Stores.Mechanics; - -public class MechanicDataStore : IMechanicDataStore -{ - private readonly CheckDriveApi _apiClient; - - public MechanicDataStore(CheckDriveApi apiClient) - { - _apiClient = apiClient; - } - - public Task<Mechanic> CreateMechanicAsync(Mechanic mechanic) - { - throw new NotImplementedException(); - } - - public Task DeleteMechanicAsync(int id) - { - throw new NotImplementedException(); - } - - public Task<Mechanic> GetMechanicAsync(int id) - { - throw new NotImplementedException(); - } - - public Task<GetMechanicResponse> GetMechanics(int accountId) - { - throw new NotImplementedException(); - } - - public Task<GetMechanicResponse> GetMechanicsAsync() - { - throw new NotImplementedException(); - } - - public Task<Mechanic> UpdateMechanicAsync(int id, Mechanic mechanic) - { - throw new NotImplementedException(); - } -} \ No newline at end of file diff --git a/CheckDrive.Web/CheckDrive.Web/Stores/Menu/IMenuService.cs b/CheckDrive.Web/CheckDrive.Web/Stores/Menu/IMenuService.cs index d1123b0a..0510114a 100644 --- a/CheckDrive.Web/CheckDrive.Web/Stores/Menu/IMenuService.cs +++ b/CheckDrive.Web/CheckDrive.Web/Stores/Menu/IMenuService.cs @@ -2,5 +2,5 @@ public interface IMenuService { - List<Object> GetMenuItems(string role); + List<Object> GetMenuItems(); } diff --git a/CheckDrive.Web/CheckDrive.Web/Stores/Menu/MenuService.cs b/CheckDrive.Web/CheckDrive.Web/Stores/Menu/MenuService.cs index da3ee9c8..1eb6be86 100644 --- a/CheckDrive.Web/CheckDrive.Web/Stores/Menu/MenuService.cs +++ b/CheckDrive.Web/CheckDrive.Web/Stores/Menu/MenuService.cs @@ -2,7 +2,7 @@ public class MenuService : IMenuService { - public List<Object> GetMenuItems(string role) + public List<Object> GetMenuItems() { List<Object> menuItems = new List<Object>(); menuItems.Add(new @@ -19,12 +19,6 @@ public List<Object> GetMenuItems(string role) url = "/debts", }); - menuItems.Add(new - { - text = "Umumiy", - separator = true, - }); - menuItems.Add(new { text = "Ishchilar", @@ -46,134 +40,6 @@ public List<Object> GetMenuItems(string role) url = "/oilMarks" }); - menuItems.Add(new - { - text = "Tekshiruvlar", - separator = true, - }); - - menuItems.Add(new - { - text = "Shifokor", - iconCss = "fa-solid fa-briefcase-medical", - url = "/doctorreviews" - }); - - menuItems.Add(new - { - text = "Mexanik (Topshirish)", - iconCss = "fa-solid fa-tools", - url = "/mechanichandovers" - }); - - menuItems.Add(new - { - text = "Operator", - iconCss = "fa-solid fa-headset", - url = "/OperatorReviews" - }); - - menuItems.Add(new - { - text = "Mexanik (Qabul qilish)", - iconCss = "fa-solid fa-car-on", - url = "/mechanicacceptances" - }); - - menuItems.Add(new - { - text = "Dispetcher", - iconCss = "fa-solid fa-user-gear", - url = "/DispatcherReviews" - }); - - if (role == "1") - { - } - else if (role == "3") - { - menuItems.Add(new - { - text = "Asosiy sahifa", - iconCss = "fa-solid fa-house", - url = "/doctorreviews/personalindex" - }); - - menuItems.Add(new - { - text = "Tarixni ko'rish", - iconCss = "fa-solid fa-clock-rotate-left", - url = "/doctorreviews/historyindexforpersonalpage" - }); - } - else if (role == "4") - { - menuItems.Add(new - { - text = "Asosiy sahifa", - iconCss = "fa-solid fa-house", - url = "/operatorreviews/personalindex" - }); - - menuItems.Add(new - { - text = " Hisobot", - iconCss = "fa-regular fa-clipboard", - url = "/operatorreviews/reportindexforpersonalpage" - }); - - menuItems.Add(new - { - text = "Tarixni ko'rish", - iconCss = "fa-solid fa-clock-rotate-left", - url = "/operatorreviews/historyindexforpersonalpage" - }); - } - else if (role == "5") - { - menuItems.Add(new - { - text = "Asosiy sahifa", - iconCss = "fa-solid fa-house", - url = "/dispatcherreviews/personalindex" - }); - - menuItems.Add(new - { - text = "Tarixni ko'rish", - iconCss = "fa-solid fa-clock-rotate-left", - url = "/dispatcherreviews/historyindexforpersonalpage" - }); - } - else if (role == "6") - { - - menuItems.Add(new - { - id = "handoversItem", - text = "Topshirish", - iconCss = "fa-solid fa-tools", - url = "/mechanichandovers/personalindex" - }); - - - menuItems.Add(new - { - id = "acceptancesItem", - text = "Qabul qilish", - iconCss = "fa-solid fa-car-on", - url = "/mechanicacceptances/personalindex" - }); - - menuItems.Add(new - { - id = "historyItem", - text = "Tarixni ko'rish", - iconCss = "fa-solid fa-clock-rotate-left", - url = "/mechanicacceptances/historyindexforpersonalpage" - }); - } - return menuItems; } } diff --git a/CheckDrive.Web/CheckDrive.Web/Stores/MockDashboard/IMockDashboardStore.cs b/CheckDrive.Web/CheckDrive.Web/Stores/MockDashboard/IMockDashboardStore.cs deleted file mode 100644 index 3d1bb443..00000000 --- a/CheckDrive.Web/CheckDrive.Web/Stores/MockDashboard/IMockDashboardStore.cs +++ /dev/null @@ -1,9 +0,0 @@ -using CheckDrive.Web.ViewModels.Dashboard; - -namespace CheckDrive.Web.Stores.MockDashboard -{ - public interface IMockDashboardStore - { - public Task<DashboardViewModel> GetDashboard(); - } -} diff --git a/CheckDrive.Web/CheckDrive.Web/Stores/MockDashboard/MockDashboardStore.cs b/CheckDrive.Web/CheckDrive.Web/Stores/MockDashboard/MockDashboardStore.cs deleted file mode 100644 index fbce5ad8..00000000 --- a/CheckDrive.Web/CheckDrive.Web/Stores/MockDashboard/MockDashboardStore.cs +++ /dev/null @@ -1,12 +0,0 @@ -using CheckDrive.Web.ViewModels.Dashboard; - -namespace CheckDrive.Web.Stores.MockDashboard -{ - public class MockDashboardStore : IMockDashboardStore - { - public async Task<DashboardViewModel> GetDashboard() - { - return new DashboardViewModel(null, null, null, null); - } - } -} diff --git a/CheckDrive.Web/CheckDrive.Web/Stores/OperatorReviews/IOperatorReviewDataStore.cs b/CheckDrive.Web/CheckDrive.Web/Stores/OperatorReviews/IOperatorReviewDataStore.cs deleted file mode 100644 index fb137ec5..00000000 --- a/CheckDrive.Web/CheckDrive.Web/Stores/OperatorReviews/IOperatorReviewDataStore.cs +++ /dev/null @@ -1,15 +0,0 @@ -using CheckDrive.ApiContracts.OperatorReview; -using CheckDrive.Web.Responses; - -namespace CheckDrive.Web.Stores.OperatorReviews -{ - public interface IOperatorReviewDataStore - { - Task<GetOperatorReviewResponse> GetOperatorReviews(int? pageNumber, string? searchString, DateTime? date, string? status, int? roleId, int? accountId); - Task<OperatorReviewDto> GetOperatorReview(int id); - Task<OperatorReviewDto> CreateOperatorReview(OperatorReviewForCreateDto review); - Task<OperatorReviewDto> UpdateOperatorReview(int id, OperatorReviewForUpdateDto operatorReview); - Task DeleteOperatorReview(int id); - Task<Stream> GetExportFile(int year, int month); - } -} diff --git a/CheckDrive.Web/CheckDrive.Web/Stores/OperatorReviews/OperatorReviewDataStore.cs b/CheckDrive.Web/CheckDrive.Web/Stores/OperatorReviews/OperatorReviewDataStore.cs deleted file mode 100644 index da49754f..00000000 --- a/CheckDrive.Web/CheckDrive.Web/Stores/OperatorReviews/OperatorReviewDataStore.cs +++ /dev/null @@ -1,45 +0,0 @@ -using CheckDrive.ApiContracts.OperatorReview; -using CheckDrive.Web.Responses; -using CheckDrive.Web.Services; - -namespace CheckDrive.Web.Stores.OperatorReviews; - -public class OperatorReviewDataStore : IOperatorReviewDataStore -{ - private readonly CheckDriveApi _apiClient; - - public OperatorReviewDataStore(CheckDriveApi apiClient) - { - _apiClient = apiClient; - } - - public Task<OperatorReviewDto> CreateOperatorReview(OperatorReviewForCreateDto review) - { - throw new NotImplementedException(); - } - - public Task DeleteOperatorReview(int id) - { - throw new NotImplementedException(); - } - - public Task<Stream> GetExportFile(int year, int month) - { - throw new NotImplementedException(); - } - - public Task<OperatorReviewDto> GetOperatorReview(int id) - { - throw new NotImplementedException(); - } - - public Task<GetOperatorReviewResponse> GetOperatorReviews(int? pageNumber, string? searchString, DateTime? date, string? status, int? roleId, int? accountId) - { - throw new NotImplementedException(); - } - - public Task<OperatorReviewDto> UpdateOperatorReview(int id, OperatorReviewForUpdateDto operatorReview) - { - throw new NotImplementedException(); - } -} diff --git a/CheckDrive.Web/CheckDrive.Web/Stores/Operators/IOperatorDataStore.cs b/CheckDrive.Web/CheckDrive.Web/Stores/Operators/IOperatorDataStore.cs deleted file mode 100644 index f4d0df0c..00000000 --- a/CheckDrive.Web/CheckDrive.Web/Stores/Operators/IOperatorDataStore.cs +++ /dev/null @@ -1,16 +0,0 @@ -using CheckDrive.Web.Models; -using CheckDrive.Web.Responses; - -namespace CheckDrive.Web.Stores.Operators -{ - public interface IOperatorDataStore - { - Task<GetOperatorResponse> GetOperators(int accountId); - Task<GetOperatorResponse> GetOperators(); - Task<Operator> GetOperator(int id); - Task<Operator> CreateOperator(Operator @operator); - Task<Operator> UpdateOperator(int id, Operator @operator); - Task DeleteOperator(int id); - } -} - \ No newline at end of file diff --git a/CheckDrive.Web/CheckDrive.Web/Stores/Operators/OperatorDataStore.cs b/CheckDrive.Web/CheckDrive.Web/Stores/Operators/OperatorDataStore.cs deleted file mode 100644 index f64f991d..00000000 --- a/CheckDrive.Web/CheckDrive.Web/Stores/Operators/OperatorDataStore.cs +++ /dev/null @@ -1,45 +0,0 @@ -using CheckDrive.Web.Models; -using CheckDrive.Web.Responses; -using CheckDrive.Web.Services; - -namespace CheckDrive.Web.Stores.Operators; - -public class OperatorDataStore : IOperatorDataStore -{ - private readonly CheckDriveApi _apiClient; - - public OperatorDataStore(CheckDriveApi apiClient) - { - _apiClient = apiClient; - } - - public Task<Operator> CreateOperator(Operator @operator) - { - throw new NotImplementedException(); - } - - public Task DeleteOperator(int id) - { - throw new NotImplementedException(); - } - - public Task<Operator> GetOperator(int id) - { - throw new NotImplementedException(); - } - - public Task<GetOperatorResponse> GetOperators(int accountId) - { - throw new NotImplementedException(); - } - - public Task<GetOperatorResponse> GetOperators() - { - throw new NotImplementedException(); - } - - public Task<Operator> UpdateOperator(int id, Operator @operator) - { - throw new NotImplementedException(); - } -} diff --git a/CheckDrive.Web/CheckDrive.Web/Stores/Roles/IRoleDataStore.cs b/CheckDrive.Web/CheckDrive.Web/Stores/Roles/IRoleDataStore.cs deleted file mode 100644 index 327ddbf2..00000000 --- a/CheckDrive.Web/CheckDrive.Web/Stores/Roles/IRoleDataStore.cs +++ /dev/null @@ -1,16 +0,0 @@ -using CheckDrive.ApiContracts.Role; -using CheckDrive.Web.Responses; - -namespace CheckDrive.Web.Stores.Roles -{ - public interface IRoleDataStore - { - Task<GetRoleResponse> GetRoles(); - Task<RoleDto> GetRole(int id); - Task<RoleDto> CreateRole(RoleForCreateDto role); - Task<RoleDto> UpdateRole(int id, RoleForUpdateDto role); - Task DeleteRole(int id); - Task CreateRole(DTOs.Role.RoleForCreateDto role); - Task UpdateRole(int id, RoleForCreateDto role); - } -} diff --git a/CheckDrive.Web/CheckDrive.Web/Stores/Roles/RoleDataStore.cs b/CheckDrive.Web/CheckDrive.Web/Stores/Roles/RoleDataStore.cs deleted file mode 100644 index 733ed34e..00000000 --- a/CheckDrive.Web/CheckDrive.Web/Stores/Roles/RoleDataStore.cs +++ /dev/null @@ -1,49 +0,0 @@ -using CheckDrive.Web.Responses; -using CheckDrive.Web.Services; - -namespace CheckDrive.Web.Stores.Roles; - -public class RoleDataStore : IRoleDataStore -{ - private readonly CheckDriveApi _apiClient; - - public RoleDataStore(CheckDriveApi apiClient) - { - _apiClient = apiClient; - } - - public Task<ApiContracts.Role.RoleDto> CreateRole(ApiContracts.Role.RoleForCreateDto role) - { - throw new NotImplementedException(); - } - - public Task CreateRole(DTOs.Role.RoleForCreateDto role) - { - throw new NotImplementedException(); - } - - public Task DeleteRole(int id) - { - throw new NotImplementedException(); - } - - public Task<ApiContracts.Role.RoleDto> GetRole(int id) - { - throw new NotImplementedException(); - } - - public Task<GetRoleResponse> GetRoles() - { - throw new NotImplementedException(); - } - - public Task<ApiContracts.Role.RoleDto> UpdateRole(int id, ApiContracts.Role.RoleForUpdateDto role) - { - throw new NotImplementedException(); - } - - public Task UpdateRole(int id, ApiContracts.Role.RoleForCreateDto role) - { - throw new NotImplementedException(); - } -} diff --git a/CheckDrive.Web/CheckDrive.Web/Stores/Technicians/ITechnicianDataStore.cs b/CheckDrive.Web/CheckDrive.Web/Stores/Technicians/ITechnicianDataStore.cs deleted file mode 100644 index bf9b3c8d..00000000 --- a/CheckDrive.Web/CheckDrive.Web/Stores/Technicians/ITechnicianDataStore.cs +++ /dev/null @@ -1,13 +0,0 @@ -using CheckDrive.Web.Models; - -namespace CheckDrive.Web.Stores.Technicians -{ - public interface ITechnicianDataStore - { - Task<List<Technician>> GetTechnicians(); - Task<Technician> GetTechnician(int id); - Task<Technician> CreateTechnician(Technician technician); - Task<Technician> UpdateTechnician(int id, Technician technician); - Task DeleteTechnician(int id); - } -} diff --git a/CheckDrive.Web/CheckDrive.Web/Stores/Technicians/MockTechnicianDataStore.cs b/CheckDrive.Web/CheckDrive.Web/Stores/Technicians/MockTechnicianDataStore.cs deleted file mode 100644 index 09add23f..00000000 --- a/CheckDrive.Web/CheckDrive.Web/Stores/Technicians/MockTechnicianDataStore.cs +++ /dev/null @@ -1,60 +0,0 @@ -using CheckDrive.Web.Models; - -namespace CheckDrive.Web.Stores.Technicians -{ - public class MockTechnicianDataStore : ITechnicianDataStore - { - private readonly List<Technician> _technician; - - public MockTechnicianDataStore() - { - _technician = new List<Technician> - { - new Technician{ Id = 1, AccountId = 1 }, - new Technician{ Id = 2, AccountId = 2 }, - }; - } - - public async Task<List<Technician>> GetTechnicians() - { - await Task.Delay(100); - return _technician.ToList(); - } - - public async Task<Technician> GetTechnician(int id) - { - await Task.Delay(100); - return _technician.FirstOrDefault(t => t.Id == id); - } - - public async Task<Technician> CreateTechnician(Technician technician) - { - await Task.Delay(100); - technician.Id = _technician.Max(t => t.Id) + 1; - _technician.Add(technician); - return technician; - - } - - public async Task<Technician> UpdateTechnician(int id, Technician technician) - { - await Task.Delay(100); - var exectingTechnician = _technician.FirstOrDefault(t => t.Id == id); - if (exectingTechnician != null) - { - exectingTechnician.AccountId = technician.AccountId; - } - return exectingTechnician; - } - - public async Task DeleteTechnician(int id) - { - await Task.Delay(100); - var exectingTechnician = _technician.FirstOrDefault(t => t.Id == id); - if (exectingTechnician != null) - { - _technician.Remove(exectingTechnician); - } - } - } -} diff --git a/CheckDrive.Web/CheckDrive.Web/Stores/User/IUserDataStore.cs b/CheckDrive.Web/CheckDrive.Web/Stores/User/IUserDataStore.cs deleted file mode 100644 index b2227664..00000000 --- a/CheckDrive.Web/CheckDrive.Web/Stores/User/IUserDataStore.cs +++ /dev/null @@ -1,10 +0,0 @@ -using CheckDrive.ApiContracts.Account; -using CheckDrive.Web.ViewModels; - -namespace CheckDrive.Web.Stores.User -{ - public interface IUserDataStore - { - public Task<(bool Success, string Token)> AuthenticateLoginAsync(AccountForLoginDto loginViewModel); - } -} diff --git a/CheckDrive.Web/CheckDrive.Web/Stores/User/UserDataStore.cs b/CheckDrive.Web/CheckDrive.Web/Stores/User/UserDataStore.cs deleted file mode 100644 index c6df5285..00000000 --- a/CheckDrive.Web/CheckDrive.Web/Stores/User/UserDataStore.cs +++ /dev/null @@ -1,22 +0,0 @@ -using CheckDrive.ApiContracts.Account; -using CheckDrive.Web.Services; - -namespace CheckDrive.Web.Stores.User; - -public class UserDataStore : IUserDataStore -{ - private readonly CheckDriveApi _apiClient; - - public UserDataStore(CheckDriveApi apiClient) - { - _apiClient = apiClient; - } - - public async Task<(bool Success, string Token)> AuthenticateLoginAsync(AccountForLoginDto loginViewModel) - { - var response = await _apiClient.PostAsync<AccountForLoginDto, string>("login/login", loginViewModel); - - return (true, response); - } -} - diff --git a/CheckDrive.Web/CheckDrive.Web/ViewModels/Car/CarViewModel.cs b/CheckDrive.Web/CheckDrive.Web/ViewModels/Car/CarViewModel.cs index 5cae826c..867d06c6 100644 --- a/CheckDrive.Web/CheckDrive.Web/ViewModels/Car/CarViewModel.cs +++ b/CheckDrive.Web/CheckDrive.Web/ViewModels/Car/CarViewModel.cs @@ -6,6 +6,7 @@ public class CarViewModel { public int Id { get; set; } public int OilMarkId { get; set; } + public required string OilMarkName { get; set; } public required string Model { get; set; } public required string Number { get; set; } public int ManufacturedYear { get; set; } @@ -22,4 +23,4 @@ public class CarViewModel public decimal FuelCapacity { get; set; } public decimal RemainingFuel { get; set; } public CarStatus Status { get; set; } -} +} \ No newline at end of file diff --git a/CheckDrive.Web/CheckDrive.Web/ViewModels/CheckPoint/CheckPointViewModel.cs b/CheckDrive.Web/CheckDrive.Web/ViewModels/CheckPoint/CheckPointViewModel.cs index a4aa2755..1669e729 100644 --- a/CheckDrive.Web/CheckDrive.Web/ViewModels/CheckPoint/CheckPointViewModel.cs +++ b/CheckDrive.Web/CheckDrive.Web/ViewModels/CheckPoint/CheckPointViewModel.cs @@ -4,22 +4,32 @@ namespace CheckDrive.Web.ViewModels.CheckPoint; public class CheckPointViewModel { + public int Id { get; set; } public string StartDate { get; set; } public string Driver { get; set; } public string CarModel { get; set; } - public decimal CurrentMileage { get; set; } public decimal CurrentFuelAmount { get; set; } - public string Mechanic { get; set; } + public string FormattedCurrentFuelAmount => CurrentFuelAmount.ToString("N1"); + public string MechanicAcceptance { get; set; } + public string MechanicHandover { get; set; } public decimal InitialMillage { get; set; } + public string FormattedInitialMillage => InitialMillage.ToString("N1"); public decimal FinalMileage { get; set; } + public string FormattedFinalMileage => FinalMileage.ToString("N1"); public string Operator { get; set; } public decimal InitialOilAmount { get; set; } + public string FormattedInitialOilAmount => InitialOilAmount.ToString("N1"); public decimal OilRefillAmount { get; set; } + public string FormattedOilRefillAmount => OilRefillAmount.ToString("N1"); public string Oil { get; set; } public string Dispatcher { get; set; } + public decimal RemainingFuelAmount { get; set; } public decimal FuelConsumptionAdjustment { get; set; } + public string FormattedFuelConsumptionAdjustment => FuelConsumptionAdjustment.ToString("N1"); public decimal DebtAmount { get; set; } + public string FormattedDebtAmount => DebtAmount.ToString("N1"); public CheckPointStage Stage { get; set; } public CheckPointStatus Status { get; set; } + public string? Notes { get; set; } } diff --git a/CheckDrive.Web/CheckDrive.Web/Views/Cars/Create.cshtml b/CheckDrive.Web/CheckDrive.Web/Views/Cars/Create.cshtml index 368eb606..83047a5c 100644 --- a/CheckDrive.Web/CheckDrive.Web/Views/Cars/Create.cshtml +++ b/CheckDrive.Web/CheckDrive.Web/Views/Cars/Create.cshtml @@ -26,7 +26,7 @@ </div> <div class="col-md-6 mb-3"> <label asp-for="Mileage" class="control-label">Bosib o'tilgan masofasi [km]</label> - <input asp-for="Mileage" class="form-control" /> + <input asp-for="Mileage" type="number" class="form-control" /> <span asp-validation-for="Mileage" class="text-danger"></span> </div> <div class="col-md-6 mb-3"> @@ -36,22 +36,22 @@ </div> <div class="col-md-6 mb-3"> <label asp-for="FuelCapacity" class="control-label">Yoqilg'i baki sig'imi</label> - <input asp-for="FuelCapacity" class="form-control" id="fuelTankCapacity" /> + <input asp-for="FuelCapacity" type="number" class="form-control" id="fuelTankCapacity" /> <span asp-validation-for="FuelCapacity" class="text-danger"></span> </div> <div class="col-md-6 mb-3"> <label asp-for="AverageFuelConsumption" class="control-label">100 km uchun yoqilg'i me'yori [litr]</label> - <input asp-for="AverageFuelConsumption" class="form-control" id="meduimFuelConsumption" /> + <input asp-for="AverageFuelConsumption" type="number" class="form-control" id="meduimFuelConsumption" /> <span asp-validation-for="AverageFuelConsumption" class="text-danger"></span> </div> <div class="col-md-6 mb-3"> <label asp-for="RemainingFuel" class="control-label">Avtomobildagi yoqilg'i qoldig'i [litr]</label> - <input asp-for="RemainingFuel" class="form-control" id="remainingFuel" oninput="validateRemainingFuel()" /> + <input asp-for="RemainingFuel" type="number" class="form-control" id="remainingFuel" oninput="validateRemainingFuel()" /> <span asp-validation-for="RemainingFuel" class="text-danger"></span> </div> <div class="col-md-6 mb-3"> <label asp-for="YearlyDistanceLimit" class="control-label">1 yillik bosib o'tish me'yori [km]</label> - <input asp-for="YearlyDistanceLimit" class="form-control" id="oneYearMediumDistance" oninput="calculateMonthlyDistance()" /> + <input asp-for="YearlyDistanceLimit" type="number" class="form-control" id="oneYearMediumDistance" oninput="calculateMonthlyDistance()" /> <span asp-validation-for="YearlyDistanceLimit" class="text-danger"></span> </div> <div class="col-md-6 mb-3"> diff --git a/CheckDrive.Web/CheckDrive.Web/Views/Cars/Details.cshtml b/CheckDrive.Web/CheckDrive.Web/Views/Cars/Details.cshtml index 0c4dda7c..915d791b 100644 --- a/CheckDrive.Web/CheckDrive.Web/Views/Cars/Details.cshtml +++ b/CheckDrive.Web/CheckDrive.Web/Views/Cars/Details.cshtml @@ -33,6 +33,12 @@ <div class="col text-center"> Bosib o'tgan masofasi </div> + @if (Model.OilMarkName is not null) + { + <div class="col text-center"> + Yoqilg'i turi + </div> + } <div class="col text-center"> Yoqilg'i qoldig'i </div> @@ -41,6 +47,12 @@ <div class="col text-center"> @Model.Mileage </div> + @if (Model.OilMarkName is not null) + { + <div class="col text-center"> + @Model.OilMarkName + </div> + } <div class="col text-center"> @Model.RemainingFuel </div> diff --git a/CheckDrive.Web/CheckDrive.Web/Views/Cars/Index.cshtml b/CheckDrive.Web/CheckDrive.Web/Views/Cars/Index.cshtml index 2b9748e6..2df86160 100644 --- a/CheckDrive.Web/CheckDrive.Web/Views/Cars/Index.cshtml +++ b/CheckDrive.Web/CheckDrive.Web/Views/Cars/Index.cshtml @@ -35,7 +35,7 @@ <!-- Create --> <div class="d-flex create-btn" style="gap: 15px;"> <div class="mr-2"> - <a class="btn btn-secondary" href="@Url.Action("CarHistoryIndex", "Cars")">Tarixni ko`rish</a> + <a class="btn btn-secondary" href="#">Tarixni ko`rish</a> </div> <div> <button id="openCarCreateModal" type="button" data-toggle="modal" class="btn btn-success"> diff --git a/CheckDrive.Web/CheckDrive.Web/Views/CheckPoint/Details.cshtml b/CheckDrive.Web/CheckDrive.Web/Views/CheckPoint/Details.cshtml new file mode 100644 index 00000000..5c9b9c7b --- /dev/null +++ b/CheckDrive.Web/CheckDrive.Web/Views/CheckPoint/Details.cshtml @@ -0,0 +1,140 @@ +@using CheckDrive.Web.ViewModels.CheckPoint +@model CheckPointViewModel + +@{ + ViewData["Title"] = "Details"; + Layout = "~/Views/Shared/_LayoutForModal.cshtml"; +} + +<link rel="stylesheet" href="~/css/checkPoint.css" /> + +<form id="checkpoint-form" method="post" asp-action="Create" asp-controller="CheckPoint"> + @Html.AntiForgeryToken() + <div class="grid-container"> + <div class="row content"> + <div class="col text-center">Haydovchi</div> + <div class="col text-center">Avtomobil</div> + <div class="col text-center">Hozirgi masofa</div> + <div class="col text-center">Hozirgi yoqilg'i</div> + </div> + <div class="row value"> + <input asp-for="Id" type="hidden" /> + <div class="col text-center"> + @Model.Driver + <input asp-for="Driver" type="hidden" /> + </div> + <div class="col text-center"> + @Model.CarModel + <input asp-for="CarModel" type="hidden" /> + </div> + <div class="col text-center"> + @Model.FormattedInitialMillage + <input asp-for="InitialMillage" type="hidden" /> + </div> + <div class="col text-center"> + @Model.FormattedCurrentFuelAmount + <input asp-for="CurrentFuelAmount" type="hidden" /> + </div> + </div> + + <div class="row content"> + <div class="col text-center">Mexanik (Topshirish)</div> + <div class="col text-center">Boshlang'ich masofa</div> + </div> + <div class="row value"> + <div class="col text-center"> + @Model.MechanicHandover + <input asp-for="MechanicHandover" type="hidden" /> + </div> + <div class="col text-center"> + @Model.FormattedInitialMillage + <input asp-for="InitialMillage" type="hidden" /> + </div> + </div> + + <div class="row content"> + <div class="col text-center">Operator</div> + <div class="col text-center">Yoqilg'i turi</div> + <div class="col text-center">Boshlang'ich yoqilg'i</div> + <div class="col text-center">Quyilgan yoqilg'i</div> + </div> + <div class="row value"> + <div class="col text-center"> + @Model.Operator + <input asp-for="Operator" type="hidden" /> + </div> + <div class="col text-center"> + @Model.Oil + <input asp-for="Oil" type="hidden" /> + </div> + <div class="col text-center "> + @Model.FormattedInitialOilAmount + <input asp-for="InitialOilAmount" type="hidden" /> + </div> + <div class="col text-center "> + @Model.FormattedOilRefillAmount + <input asp-for="OilRefillAmount" type="hidden" /> + </div> + </div> + + <div class="row content"> + <div class="col text-center">Mexanik (Qabul qilish)</div> + <div class="col text-center">Yakuniy masofa</div> + </div> + <div class="row value"> + <div class="col text-center"> + @Model.MechanicAcceptance + <input asp-for="MechanicAcceptance" type="hidden"/> + </div> + <div class="col text-center"> + @Model.FormattedFinalMileage + <input asp-for="FinalMileage" type="hidden" /> + </div> + </div> + + <div class="row content"> + <div class="col text-center">Dispetcher</div> + <div class="col text-center">Yoqilg'i sarfi</div> + </div> + <div class="row value"> + <div class="col text-center"> + @Model.Dispatcher + <input asp-for="Dispatcher" type="hidden" /> + </div> + <div class="col text-center"> + @Model.FormattedFuelConsumptionAdjustment + <input asp-for="FuelConsumptionAdjustment" type="hidden" /> + </div> + </div> + + <div class="row content"> + <div class="col text-center">Avtomobilning yakuniy qiymatlari</div> + </div> + <div class="row value"> + <div class="col text-center"> + Yakuniy masofa + <input asp-for="FinalMileage" type="number" min="0" class="form-control text-center" /> + </div> + <div class="col text-center"> + Hozirgi yoqilg'i + <input asp-for="RemainingFuelAmount" type="number" min="0" class="form-control text-center" /> + </div> + <div class="col text-center"> + Qarz miqdori + <input asp-for="DebtAmount" type="number" min="0" class="form-control text-center" /> + </div> + </div> + <div class="row content"> + <div class="col"> + <textarea class="form-control text-center" asp-for="Notes" rows="3" placeholder="Izoh kiriting..."></textarea> + </div> + </div> + + + <div class="d-flex col-md justify-content-center"> + <button id="openModalButton" class="save-button" type="submit"> + Saqlash + </button> + </div> + </div> +</form> diff --git a/CheckDrive.Web/CheckDrive.Web/Views/CheckPoint/Index.cshtml b/CheckDrive.Web/CheckDrive.Web/Views/CheckPoint/Index.cshtml deleted file mode 100644 index 8a4df275..00000000 --- a/CheckDrive.Web/CheckDrive.Web/Views/CheckPoint/Index.cshtml +++ /dev/null @@ -1,143 +0,0 @@ -@using CheckDrive.Web.ViewModels.CheckPoint -@model CheckPointViewModel - -@{ - ViewData["Title"] = "Index"; - Layout = "~/Views/Shared/_Layout.cshtml"; -} - -<div class="grid-container m-5"> - <div class="row content"> - <div class="col text-center"> - Haydovchi - </div> - <div class="col text-center"> - Avtomobil - </div> - <div class="col text-center"> - Hozirgi masofa - </div> - <div class="col text-center"> - Hozirgi yoqilg'i - </div> - </div> - <div class="row value"> - <div class="col text-center"> - @Model.Driver - </div> - <div class="col text-center"> - @Model.CarModel - </div> - <div class="col text-center"> - @Model.CurrentMileage - </div> - <div class="col text-center"> - @Model.CurrentFuelAmount - </div> - </div> - <div class="row content"> - <div class="col text-center"> - Mexanik - </div> - <div class="col text-center"> - Boshlang'ich masofa - </div> - </div> - <div class="row value"> - <div class="col text-center"> - @Model.Mechanic - </div> - <div class="col text-center"> - @Model.InitialMillage - </div> - </div> - <div class="row content"> - <div class="col text-center"> - Operator - </div> - <div class="col text-center"> - Boshlang'ich yoqilg'i' - </div> - <div class="col text-center"> - Quyilgan yoqilg'i - </div> - <div class="col text-center"> - Yoqilg'i turi - </div> - </div> - <div class="row value"> - <div class="col text-center"> - @Model.Operator - </div> - <div class="col text-center"> - @Model.InitialOilAmount - </div> - <div class="col text-center"> - @Model.OilRefillAmount - </div> - <div class="col text-center"> - @Model.Oil - </div> - </div> - <div class="row content"> - <div class="col text-center"> - Mexanik - </div> - <div class="col text-center"> - Yakuniy masofa - </div> - </div> - <div class="row value"> - <div class="col text-center"> - @Model.Mechanic - </div> - <div class="col text-center"> - @Model.FinalMileage - </div> - </div> - <div class="row content"> - <div class="col text-center"> - Dispetcher - </div> - <div class="col text-center"> - Yoqilg'i sarfi - </div> - </div> - <div class="row value"> - <div class="col text-center"> - @Model.Dispatcher - </div> - <div class="col text-center"> - @Model.FuelConsumptionAdjustment - </div> - </div> - <div class="row content"> - <div class="col text-center"> - Avtomobilning yakuniy qiymatlari - </div> - </div> - <div class="row value"> - <div class="col text-center"> - <input type="number" class="form-control" style="text-align:center;" name="FinalMileage" value="@Model.FinalMileage" /> - </div> - <div class="col text-center"> - <input type="number" class="form-control" style="text-align:center;" name="CurrentFuelAmount" value="@Model.CurrentFuelAmount" /> - </div> - <div class="col text-center"> - <input type="number" class="form-control" style="text-align:center;" name="DebtAmount" value="@Model.DebtAmount" /> - </div> - </div> - <div class="row content"> - <div class="col text-center"> - Qarz - </div> - </div> - <div class="row value"> - - </div> - <div class="d-flex col-md mb-4 justify-content-center"> - <button id="openModalButton" class="btn btn-success" asp-action="create" type="button"> - <i class="fa"></i> Saqlash - </button> - </div> -</div> diff --git a/CheckDrive.Web/CheckDrive.Web/Views/Dashboard/Index.cshtml b/CheckDrive.Web/CheckDrive.Web/Views/Dashboard/Index.cshtml deleted file mode 100644 index 1e805680..00000000 --- a/CheckDrive.Web/CheckDrive.Web/Views/Dashboard/Index.cshtml +++ /dev/null @@ -1,189 +0,0 @@ -@{ -} - -<div class="row mb-3"> - <div class="col-md-4"> - <div class="d-flex flex-row widget summary car " data-bs-toggle="tooltip" data-bs-placement="top"> - <div class="icon-container p-5 car-widget" > - <i class="fa-solid fa-car fa-2xl"></i> - </div> - <div class="d-flex flex-column m-auto py-3" id="revenueContainer" onclick="toggleRevenue()"> - <span class="lead fw-bold">Avtomobillar soni</span> - <h1 class="display-6 fw-bold" >@ViewBag.CarsCount</h1> - </div> - </div> - </div> - - <div class="col-md-4"> - <div class="d-flex flex-row widget summary driver"> - <div class="icon-container p-5 car-widget" > - <i class="fa-solid fa-user fa-2xl"></i> - </div> - <div class="d-flex flex-column m-auto py-3"> - <span class="lead fw-bold">Haydovchilar soni</span> - <h1 class="display-6 fw-bold" >@ViewBag.DriversCount</h1> - </div> - </div> - </div> - - <div class="col-md-4"> - <div class="d-flex flex-row widget summary oil"> - <div class="icon-container p-5 car-widget" > - <i class="fa-solid fa-gas-pump fa-2xl"></i> - </div> - <div class="d-flex flex-column m-auto py-3"> - <span class="lead fw-bold">Yoqilg'i sarfi</span> - <h1 class="display-6 fw-bold">@ViewBag.MonthlyFuelConsumption</h1> - </div> - </div> - </div> -</div> - -<div class="row"> - <div class="col-md-4"> - <div class="widget chart"> - <div class="p-4"> - <h5 class="fw-bold">Kasblar bo'yicha ishchilar soni</h5> - </div> - <ejs-accumulationchart id="doughnutchart" enableSmartLabels background="white"> - <e-accumulation-series-collection> - <e-accumulation-series dataSource="@ViewBag.EmployeesCountByRole" - xName="RoleName" yName="CountOfEmployees" - innerRadius="60%" legendShape="Circle" - palettes=@(new string[]{ "#D35400","#3498DB","#27AE60","#1ABC9C","#8E44AD","#F39C12" })> - <e-accumulationseries-datalabel name="formattedAmount" visible> - </e-accumulationseries-datalabel> - </e-accumulation-series> - </e-accumulation-series-collection> - - <e-accumulationchart-legendsettings position="Top" toggleVisibility="true"> - <e-legendsettings-textstyle color="#0f0f0f" size="1.2rem"></e-legendsettings-textstyle> - </e-accumulationchart-legendsettings> - <e-accumulationchart-tooltipsettings enable></e-accumulationchart-tooltipsettings> - </ejs-accumulationchart> - - </div> - </div> - <div class="col-md-8"> - <div class="widget chart"> - <div class="p-4"> - <h5 class="fw-bold">Yoqilg'i sarfi</h5> - </div> - <ejs-chart id="spline-chart" background="white" - palettes=@(new string[]{"#F24A38","#1374D6","#1DB413","#ffe91a","#9547C7"})> - <e-chart-primaryxaxis valueType="Category"> - <e-majorgridlines width="1"></e-majorgridlines> - <e-majorticklines width="1"></e-majorticklines> - </e-chart-primaryxaxis> - <e-chart-primaryyaxis> - <e-majorgridlines width="1" color="#32414d" dashArray="3,5"></e-majorgridlines> - <e-majorticklines width="1"></e-majorticklines> - <e-linestyle width="0"></e-linestyle> - </e-chart-primaryyaxis> - <e-chart-chartarea> - <e-chartarea-border width="1"></e-chartarea-border> - </e-chart-chartarea> - <e-series-collection> - <e-series dataSource="@ViewBag.SplineChartData" xName="Month" width="3" - yName="Ai80" name="Ai80" type="Spline"></e-series> - <e-series dataSource="@ViewBag.SplineChartData" xName="Month" width="3" - yName="Ai91" name="Ai91" type="Spline"></e-series> - <e-series dataSource="@ViewBag.SplineChartData" xName="Month" width="3" - yName="Ai92" name="Ai92" type="Spline"></e-series> - <e-series dataSource="@ViewBag.SplineChartData" xName="Month" width="3" - yName="Ai95" name="Ai95" type="Spline"></e-series> - <e-series dataSource="@ViewBag.SplineChartData" xName="Month" width="3" - yName="Diesel" name="Diesel" type="Spline"></e-series> - </e-series-collection> - <e-chart-legendsettings position="Top" alignment="Far" toggleVisibility="false"> - <e-legendsettings-textstyle color="#0f0f0f" size="1rem"></e-legendsettings-textstyle> - </e-chart-legendsettings> - <e-chart-tooltipsettings enable shared></e-chart-tooltipsettings> - </ejs-chart> - </div> - </div> -</div> -<div class="row"> - <div class="col"> - <div style="margin-bottom:10px;"> - <ejs-grid id="resent-checkpoints" - style="margin-left:0px; margin-right:0px;" - allowPaging="true" - allowSorting="true" - dataSource="@ViewBag.CheckPoint" - gridLines="Both"> - <e-grid-pagesettings pageSize="12"></e-grid-pagesettings> - <e-grid-columns> - <e-grid-column headerText="Id" field="Id" template="#navigationColumnTemplate" textAlign=Center headerTextAlign=Center width="20"></e-grid-column> - <e-grid-column headerText="Haydovchi" field="Driver" textAlign=Center headerTextAlign=Center width="100"></e-grid-column> - <e-grid-column headerText="Mashina" field="CarModel" textAlign=Center headerTextAlign=Center width="80"></e-grid-column> - <e-grid-column headerText="Bosqich" template="#stageColumnTemplate" textAlign=Center headerTextAlign=Center width="100"></e-grid-column> - <e-grid-column headerText="Status" template="#statusColumnTemplate" textAlign=Center headerTextAlign=Center width="130"></e-grid-column> - </e-grid-columns> - </ejs-grid> - </div> - </div> - <div class="col-md-5"> - <div class="widget chart"> - <div class="p-4"> - <h5 class="fw-bold">Yoqilg'ilar</h5> - </div> - <ejs-accumulationchart id="fueldoughnutchart" enableSmartLabels background="white"> - <e-accumulation-series-collection> - <e-accumulation-series dataSource="@ViewBag.OilAmount" - xName="Name" yName="Amount" - innerRadius="60%" legendShape="Circle" - palettes=@(new string[]{ "#D35400","#3498DB","#27AE60","#1ABC9C","#8E44AD","#F39C12" })> - <e-accumulationseries-datalabel name="formattedAmount" visible> - </e-accumulationseries-datalabel> - </e-accumulation-series> - </e-accumulation-series-collection> - - <e-accumulationchart-legendsettings position="Top" toggleVisibility="true"> - <e-legendsettings-textstyle color="#0f0f0f" size="1.2rem"></e-legendsettings-textstyle> - </e-accumulationchart-legendsettings> - <e-accumulationchart-tooltipsettings enable></e-accumulationchart-tooltipsettings> - </ejs-accumulationchart> - </div> - </div> -</div> - -<script id="navigationColumnTemplate" type="text/x-template"> - <div> - <a rel="nofollow" href="checkpoint/index/${Id}">${Id}</a> - </div> -</script> - -<script id="stageColumnTemplate" type="text/x-template"> - ${if(Status == 0)} - <span class="badge bg-primary">Doktor tekshiruvi</span> - ${else if(Status == 1)} - <span class="badge bg-primary">Mexanik (Topshirish)</span> - ${else if(Status == 2)} - <span class="badge bg-primary">Operator tekshiruvi</span> - ${else if(Status == 3)} - <span class="badge bg-primary">Mexanik (Qabul qilish)</span> - ${else if(Status == 4)} - <span class="badge bg-primary">Dispatcher tekshiruvi</span> - ${else} - <span class="badge bg-primary">Menejer tekshiruvi</span> - ${/if} -</script> - -<script id="statusColumnTemplate" type="text/x-template"> - ${if(Status == 0)} - <span class="badge bg-warning">Jarayonda</span> - ${else if(Status == 1)} - <span class="badge bg-success">Yakunlangan</span> - ${else if(Status == 2)} - <span class="badge bg-danger">Ko'rib chiquvchi rad etdi</span> - ${else if(Status == 3)} - <span class="badge bg-danger">Haydovchi rad etdi</span> - ${else if(Status == 4)} - <span class="badge bg-danger">Avtomatik ravishda yopilgan</span> - ${else if(Status == 5)} - <span class="badge bg-warning">Menejer (Ko'rilmoqda)</span> - ${else} - <span class="badge bg-danger">Menejer tomonidan yopilgan</span> - ${/if} -</script> diff --git a/CheckDrive.Web/CheckDrive.Web/Views/Debts/Index.cshtml b/CheckDrive.Web/CheckDrive.Web/Views/Debts/Index.cshtml index c866188e..0720c483 100644 --- a/CheckDrive.Web/CheckDrive.Web/Views/Debts/Index.cshtml +++ b/CheckDrive.Web/CheckDrive.Web/Views/Debts/Index.cshtml @@ -27,17 +27,6 @@ input="searchAndFilter"> </ejs-textbox> </div> - <div class="filter-bar w-40"> - <ejs-combobox id="statuses-combobox" - placeholder="Holat bo'yicha saralash" - floatLabelType="Never" - dataSource="@ViewBag.SelectedStatus" - value="@ViewBag.SelectedStatus" - allowObjectBinding="true" - change="searchAndFilter"> - <e-combobox-fields value="Value" text="Text"></e-combobox-fields> - </ejs-combobox> - </div> </div> </div> </div> diff --git a/CheckDrive.Web/CheckDrive.Web/Views/DispatcherReviews/Create.cshtml b/CheckDrive.Web/CheckDrive.Web/Views/DispatcherReviews/Create.cshtml deleted file mode 100644 index 37179224..00000000 --- a/CheckDrive.Web/CheckDrive.Web/Views/DispatcherReviews/Create.cshtml +++ /dev/null @@ -1,121 +0,0 @@ -@model CheckDrive.ApiContracts.DispatcherReview.DispatcherReviewForCreateDto - -@{ - ViewData["Title"] = "Create"; -} - -<div class="row mt-custom"> - <div class="col-md-4 offset-md-1 mt-5"> - <h4>Ro'yxatga olish</h4> - <hr class="w-50" /> - <form asp-action="Create" method="post" id="createForm"> - <div asp-validation-summary="ModelOnly" class="text-danger"></div> - <div class="form-group w-50"> - <label asp-for="DistanceCovered" class="control-label">Bosib otilgan masofa</label> - <input asp-for="DistanceCovered" class="form-control" type="number" /> - <span asp-validation-for="DistanceCovered" class="text-danger"></span> - </div> - <div class="form-group w-50"> - <label class="control-label">Avtomobil bakidagi yoqilg`i miqdori</label> - <input type="text" class="form-control" value="@ViewBag.FuelRemaining" disabled /> - <input type="hidden" id="FuelRemaining" name="FuelRemaining" value="@ViewBag.FuelRemaining" /> - </div> - <div class="form-group w-50"> - <label asp-for="FuelSpended" class="control-label">Sariflangan yoqilgi</label> - <input asp-for="FuelSpended" class="form-control" id="FuelSpended" type="number" step="any" /> - <span asp-validation-for="FuelSpended" class="text-danger" id="fuelSpendedError"></span> - </div> - <div class="form-group w-50"> - <input asp-for="Date" type="hidden" id="hiddenDate" /> - </div> - <div class="form-group w-50"> - <input asp-for="DispatcherId" type="hidden" /> - </div> - <div class="form-group w-50"> - <input asp-for="OperatorId" type="hidden" /> - </div> - <div class="form-group w-50"> - <input asp-for="MechanicId" type="hidden" /> - </div> - <div class="form-group w-50"> - <input asp-for="DriverId" type="hidden" /> - </div> - <div class="form-group w-50"> - <input asp-for="CarId" type="hidden" /> - </div> - <div class="form-group w-50"> - <input asp-for="MechanicHandoverId" type="hidden" /> - </div> - <div class="form-group w-50"> - <input asp-for="MechanicAcceptanceId" type="hidden" /> - </div> - <div class="form-group w-50"> - <input asp-for="OperatorReviewId" type="hidden" /> - </div> - <div class="form-group mt-3 w-50 "> - <button class="btn btn-outline-success" type="submit"> - Saqlash - </button> - </div> - </form> - </div> -</div> - -<!-- Bootstrap Modal for Error Message --> -<div class="modal fade" id="errorModal" tabindex="-1" aria-labelledby="errorModalLabel" aria-hidden="true"> - <div class="modal-dialog"> - <div class="modal-content"> - <div class="modal-header"> - <h5 class="modal-title" id="errorModalLabel">Xato</h5> - <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button> - </div> - <div class="modal-body" id="errorModalBody"> - <!-- Error message will be injected here --> - </div> - <div class="modal-footer"> - <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Yopish</button> - </div> - </div> - </div> -</div> - -@section Scripts { - <script> - document.getElementById('createForm').addEventListener('submit', function (event) { - var fuelSpended = parseFloat(document.getElementById('FuelSpended').value); - var fuelRemaining = parseFloat(document.getElementById('FuelRemaining').value); - var fuelSpendedError = document.getElementById('fuelSpendedError'); - var errorModalBody = document.getElementById('errorModalBody'); - - fuelSpendedError.textContent = ''; - errorModalBody.textContent = ''; - - if (isNaN(fuelSpended) || fuelSpended < 0 || fuelSpended > fuelRemaining) { - event.preventDefault(); - var errorMessage = 'Sariflangan yoqilgi miqdori 0 va ' + fuelRemaining + ' orasida bo\'lishi kerak'; - fuelSpendedError.textContent = errorMessage; - - // Show the error message in the modal - errorModalBody.textContent = errorMessage; - var errorModal = new bootstrap.Modal(document.getElementById('errorModal')); - errorModal.show(); - - return false; - } - - var distanceCovered = document.getElementById('DistanceCovered').value; - var currentDate = new Date().toISOString(); - - if (!distanceCovered) { - document.getElementById('DistanceCovered').value = '0'; - } - - if (!fuelSpended) { - document.getElementById('FuelSpended').value = '0'; - } - - document.getElementById('hiddenDate').value = currentDate; - }); - </script> -} - diff --git a/CheckDrive.Web/CheckDrive.Web/Views/DispatcherReviews/Delete.cshtml b/CheckDrive.Web/CheckDrive.Web/Views/DispatcherReviews/Delete.cshtml deleted file mode 100644 index 9c50e9a8..00000000 --- a/CheckDrive.Web/CheckDrive.Web/Views/DispatcherReviews/Delete.cshtml +++ /dev/null @@ -1,86 +0,0 @@ -@model CheckDrive.ApiContracts.DispatcherReview.DispatcherReviewDto - -@{ - ViewData["Title"] = "Delete"; -} - -<h1 class="align-items-baseline" style="margin-top: 100px">O'chirish</h1> -<hr /> - -<h3 style="color:grey;"> - Haqiqatan ham buni oʻchirib tashlamoqchimisiz? - O'chirsangiz bu mashina ishtirok etgan barcha ma'lumotlar ham o'chiriladi!!! -</h3> -<div> - <h4>DispatcherReview</h4> - <hr /> - <dl class="row"> - <dt class="col-sm-2"> - Dispetcher F.I.SH: - </dt> - <dd class="col-sm-10"> - @Html.DisplayFor(model => model.DispatcherName) - </dd> - <dt class="col-sm-2"> - Haydovchi F.I.SH: - </dt> - <dd class="col-sm-10"> - @Html.DisplayFor(model => model.DriverName) - </dd> - <dt class="col-sm-2"> - Mexanik F.I.SH: - </dt> - <dd class="col-sm-10"> - @Html.DisplayFor(model => model.MechanicName) - </dd> - <dt class="col-sm-2"> - Operator F.I.SH: - </dt> - <dd class="col-sm-10"> - @Html.DisplayFor(model => model.OperatorName) - </dd> - <dt class="col-sm-2"> - Ro'yxatga olingan vaqt: - </dt> - <dd class="col-sm-10"> - @(Model.Date.ToString("yyyy-MM-dd | HH:mm")) - </dd> - <dt class="col-sm-2"> - Avtomobil: - </dt> - <dd class="col-sm-10"> - @Html.DisplayFor(model => model.CarName) - </dd> - <dt class="col-sm-2"> - O'rtacha yoqilg'i sarfi: - </dt> - <dd class="col-sm-10"> - @Html.DisplayFor(model => model.CarMeduimFuelConsumption) - </dd> - <dt class="col-sm-2"> - Bosib o'tilgan masofa: - </dt> - <dd class="col-sm-10"> - @Html.DisplayFor(model => model.DistanceCovered) - </dd> - <dt class="col-sm-2"> - Sarflangan yoqilg'i: - </dt> - <dd class="col-sm-10"> - @Html.DisplayFor(model => model.FuelSpended) - </dd> - </dl> - - <form asp-action="Delete"> - <div class="form-group"> - <a asp-action="Index" class="btn btn-outline-info"> - <i class="fa-solid fa-arrow-left-long"></i> - Orqaga - </a> - <button asp-route-itemid="@Model.Id" class="btn btn-outline-danger"> - <i class="fa-solid fa-trash"></i> - O'chirish - </button> - </div> - </form> -</div> diff --git a/CheckDrive.Web/CheckDrive.Web/Views/DispatcherReviews/Details.cshtml b/CheckDrive.Web/CheckDrive.Web/Views/DispatcherReviews/Details.cshtml deleted file mode 100644 index 5e4d1fd2..00000000 --- a/CheckDrive.Web/CheckDrive.Web/Views/DispatcherReviews/Details.cshtml +++ /dev/null @@ -1,101 +0,0 @@ -@model CheckDrive.ApiContracts.DispatcherReview.DispatcherReviewDto - -@{ - ViewData["Title"] = "Details"; - Layout = null; -} - -<div class="grid-container mt-3"> - <div class="row content"> - <div class="col text-center"> - Dispetcher F.I.SH - </div> - <div class="col text-center"> - Haydovchi F.I.SH - </div> - </div> - <div class="row value"> - <div class="col text-center"> - @Model.DispatcherName - </div> - <div class="col text-center"> - @Model.DriverName - </div> - </div> - <div class="row content"> - <div class="col text-center"> - Mexanik F.I.SH - </div> - <div class="col text-center"> - Operator F.I.SH - </div> - </div> - <div class="row value"> - <div class="col text-center"> - @Model.MechanicName - </div> - <div class="col text-center"> - @Model.OperatorName - </div> - </div> - <div class="row content"> - <div class="col text-center"> - Avtomobil - </div> - <div class="col text-center"> - O'rtacha yoqilg'i sarfi - </div> - <div class="col text-center"> - Operator quygan yoqilg'i - </div> - </div> - <div class="row value"> - <div class="col text-center"> - @Model.CarName - </div> - <div class="col text-center"> - @Model.CarMeduimFuelConsumption - </div> - <div class="col text-center"> - @Model.PouredFuel - </div> - </div> - <div class="row content"> - <div class="col text-center"> - Ro'yxatga olingan vaqt - </div> - <div class="col text-center"> - Bosib o'tilgan masofa - </div> - <div class="col text-center"> - Sarflangan yoqilg'i - </div> - </div> - <div class="row value"> - <div class="col text-center"> - @(Model.Date.ToString("yyyy-MM-dd | HH:mm")) - </div> - <div class="col text-center"> - @Model.DistanceCovered - </div> - <div class="col text-center"> - @Model.FuelSpended - </div> - </div> - <div class="row content"> - <div class="col text-center"> - Boshlang`ich yoqilg`i qoldig`i - </div> - <div class="col text-center"> - Yakuniy yoqilg`i qoldig`i - </div> - </div> - <div class="row value"> - <div class="col text-center bottom-style"> - @Model.RemainigFuelBefore - </div> - <div class="col text-center bottom-style"> - @Model.RemainigFuelAfter - </div> - </div> -</div> \ No newline at end of file diff --git a/CheckDrive.Web/CheckDrive.Web/Views/DispatcherReviews/Edit.cshtml b/CheckDrive.Web/CheckDrive.Web/Views/DispatcherReviews/Edit.cshtml deleted file mode 100644 index bcffdf25..00000000 --- a/CheckDrive.Web/CheckDrive.Web/Views/DispatcherReviews/Edit.cshtml +++ /dev/null @@ -1,50 +0,0 @@ -@model CheckDrive.ApiContracts.DispatcherReview.DispatcherReviewDto - -@{ - ViewData["Title"] = "Edit"; -} - -<h4>Ma`lumotlarni tahrirlash</h4> -<hr /> -<div class="row"> - <div class="col-md-4"> - <form asp-action="Edit"> - <div asp-validation-summary="ModelOnly" class="text-danger"></div> - <div class="form-group mt-3"> - <label asp-for="DispatcherId" class="control-label">Dispeytcher F.I.Sh</label> - <select asp-for="DispatcherId" class="form-control" asp-items="ViewBag.DispatcherSelectList"></select> - <span asp-validation-for="DispatcherId" class="text-danger"></span> - </div> - <div class="form-group mt-3"> - <label asp-for="DriverId" class="control-label">Haydovchi F.I.Sh</label> - <select asp-for="DriverId" class="form-control" asp-items="ViewBag.DriverSelectList"></select> - <span asp-validation-for="DriverId" class="text-danger"></span> - </div> - <div class="form-group mt-3"> - <label asp-for="CarId" class="control-label">Moshina</label> - <select asp-for="CarId" class="form-control" asp-items="ViewBag.CarSelectList"></select> - <span asp-validation-for="CarId" class="text-danger"></span> - </div> - <div class="form-group mt-3"> - <label asp-for="FuelSpended" class="control-label">FuelSpended</label> - <input asp-for="FuelSpended" class="form-control" /> - <span asp-validation-for="FuelSpended" class="text-danger"></span> - </div> - <div class="form-group mt-3"> - <label asp-for="DistanceCovered" class="control-label">DistanceCovered</label> - <input asp-for="DistanceCovered" class="form-control" /> - <span asp-validation-for="DistanceCovered" class="text-danger"></span> - </div> - <div class="form-group mt-3"> - <a asp-action="Details" asp-route-id="@Model?.Id" class="btn btn-outline-info"> - <i class="fa-solid fa-arrow-left-long"></i> - Orqaga - </a> - <button class="btn btn-outline-success"> - <i class="fa fa-pencil"></i> Saqlash - </button> - </div> - </form> - </div> -</div> - diff --git a/CheckDrive.Web/CheckDrive.Web/Views/DispatcherReviews/HistoryIndexForPersonalPage.cshtml b/CheckDrive.Web/CheckDrive.Web/Views/DispatcherReviews/HistoryIndexForPersonalPage.cshtml deleted file mode 100644 index 0a608d23..00000000 --- a/CheckDrive.Web/CheckDrive.Web/Views/DispatcherReviews/HistoryIndexForPersonalPage.cshtml +++ /dev/null @@ -1,153 +0,0 @@ -@model IEnumerable<CheckDrive.ApiContracts.DispatcherReview.DispatcherReviewDto> -@{ - ViewData["Title"] = "HistoryIndexForPersonalPage"; - Layout = "~/Views/Shared/_PersonalLayout.cshtml"; -} - -<div class="container mt-5" style="max-width: 100%;"> - <div class="table-responsive"> - <table class="table table-bordered table-striped table-hover paper-shadow" style="width: 100%;"> - <thead> - <tr> - <th class="text-center vertical-align-middle" style="min-width: 150px;">Haydovchi F.I.</th> - <th class="text-center vertical-align-middle" style="min-width: 150px;">Moshina</th> - <th class="text-center vertical-align-middle" style="min-width: 200px;">Yoqilg`i meyori</th> - <th class="text-center vertical-align-middle" style="min-width: 150px;">Bosib o`tilgan masofa</th> - <th class="text-center vertical-align-middle" style="min-width: 150px;">Sarflangan yoqilg`i</th> - <th class="text-center vertical-align-middle" style="min-width: 150px;">Operator F.I.</th> - <th class="text-center vertical-align-middle" style="min-width: 150px;">Mexanik F.I.</th> - <th class="text-center vertical-align-middle" style="min-width: 150px;">Sana</th> - </tr> - </thead> - <tbody> - @if (Model != null && Model.Any()) - { - @foreach (var review in Model) - { - <tr> - <td class="text-center vertical-align-middle">@review.DriverName</td> - <td class="text-center vertical-align-middle">@review.CarName</td> - <td class="text-center vertical-align-middle">@review.CarMeduimFuelConsumption</td> - <td class="text-center vertical-align-middle">@review.DistanceCovered</td> - <td class="text-center vertical-align-middle">@String.Format("{0:F4}", review.FuelSpended)</td> - <td class="text-center vertical-align-middle">@review.OperatorName</td> - <td class="text-center vertical-align-middle">@review.MechanicName</td> - <td class="text-center vertical-align-middle">@review.Date</td> - </tr> - } - } - else - { - <tr> - <td colspan="14" class="text-center"> - Maʼlumotlar mavjud emas - </td> - </tr> - } - </tbody> - </table> - <div class="d-flex justify-content-between align-items-center my-2"> - <nav aria-label="Page navigation"> - <ul class="pagination"> - @if (ViewBag.HasPreviousPage) - { - <li class="page-item"> - <a class="page-link" href="@Url.Action("HistoryIndexForPersonalPage", new { pageNumber = 1 })" aria-label="First"> - <span aria-hidden="true">«</span> - </a> - </li> - <li class="page-item"> - <a class="page-link" href="@Url.Action("HistoryIndexForPersonalPage", new { pageNumber = ViewBag.CurrentPage - 1 })">@(@ViewBag.CurrentPage - 1)</a> - </li> - } - @if (ViewBag.HasNextPage) - { - <li class="page-item active"> - <span class="page-link">@ViewBag.CurrentPage</span> - </li> - <li class="page-item"> - <a class="page-link" href="@Url.Action("HistoryIndexForPersonalPage", new { pageNumber = ViewBag.CurrentPage + 1 })">@(@ViewBag.CurrentPage + 1)</a> - </li> - <li class="page-item"> - <a class="page-link" href="@Url.Action("HistoryIndexForPersonalPage", new { pageNumber = ViewBag.PageCount })" aria-label="Last"> - <span aria-hidden="true">»</span> - </a> - </li> - } - </ul> - </nav> - <div class="p-2"> - <p class="h6 mb-0">@ViewBag.PageCount sahifadan @ViewBag.CurrentPage tasi ( umumiy ishchilar soni: @ViewBag.TotalCount)</p> - </div> - </div> - </div> -</div> - -<style> - .nav-tabs .nav-link.active { - background-color: #007bff; - color: white; - } - - .nav-tabs .nav-link { - border: 1px solid #dee2e6; - } - - .badge { - font-size: 0.8rem; - padding: 5px 10px; - border-radius: 5px; - } - - .bg-success { - background-color: #28a745; - } - - .bg-danger { - background-color: #dc3545; - } - - .bg-secondary { - background-color: #6c757d; - } - - .container { - margin-top: 30px; - max-width: 100%; - } - - .table-bordered { - border: 1px solid #dee2e6; - } - - .table-bordered th, - .table-bordered td { - border: 1px solid #dee2e6; - } - - .paper-shadow { - background: white; - box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); - border-radius: 10px; - } - - .pagination { - justify-content: flex-end; - } - - .shadow { - box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); - } - - .pagination .page-link { - margin-left: 5px; - } - - .pagination .page-item.shadow { - box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); - } - - .vertical-align-middle { - vertical-align: middle !important; - } -</style> diff --git a/CheckDrive.Web/CheckDrive.Web/Views/DispatcherReviews/Index.cshtml b/CheckDrive.Web/CheckDrive.Web/Views/DispatcherReviews/Index.cshtml deleted file mode 100644 index 9bf59bee..00000000 --- a/CheckDrive.Web/CheckDrive.Web/Views/DispatcherReviews/Index.cshtml +++ /dev/null @@ -1,196 +0,0 @@ -@model IEnumerable<CheckDrive.ApiContracts.DispatcherReview.DispatcherReviewDto> - -@{ - ViewData["Title"] = "Index"; - Layout = "~/Views/Shared/_Layout.cshtml"; -} - -<form asp-controller="DispatcherReviews" asp-action="Index"> - <div class="row mt-4"> - <div class="d-flex justify-content-between mb-4"> - <div class="col-md-4 filter-bar position-relative"> - <div class="position-relative w-100"> - <i class="fa-solid fa-magnifying-glass position-absolute top-50 start-0 translate-middle-y ms-3" style="color: dimgray;"></i> - <ejs-textbox id="search-box" - name="search" - class="search-box ps-5" - placeholder="Izlash..." - floatLabelType="Never" - value="@ViewBag.SearchString" - input="onChangeSearchAndDate"> - </ejs-textbox> - </div> - </div> - <div class="col-md-4 date-filter"> - <div class="d-flex gap-4"> - <ejs-datepicker id="date" - format="dd-MM-yyyy" - placeholder="Sanani tanlang" - floatLabelType="Never" - change="onChangeSearchAndDate"> - </ejs-datepicker> - <button class="btn btn-outline-info dropdown-toggle" type="button" id="dropdownMenuButton" data-bs-toggle="dropdown" aria-expanded="false"> - <i class="fa-solid fa-download"></i> Yuklab olish - </button> - </div> - </div> - </div> - </div> -</form> - -<div class="row"> - <div class="col-12"> - <ejs-grid - id="dispatcherReview-list" - dataSource="@ViewBag.DispatcherReviews" - gridLines="Both" - allowSorting="true" - allowPaging="true" - dataBound="onDataBound"> - <e-grid-pagesettings pageSize="10"></e-grid-pagesettings> - <e-grid-columns> - <e-grid-column headerText="Haydovchi" field="DriverName" type="string" textAlign=Center headerTextAlign=Center ></e-grid-column> - <e-grid-column headerText="Avtomobil" field="CarName" type="string" textAlign=Center headerTextAlign=Center ></e-grid-column> - <e-grid-column headerText="Dispetcher" field="DispatcherName" type="string" textAlign=Center headerTextAlign=Center></e-grid-column> - <e-grid-column headerText="Mexanik" field="MechanicName" type="string" textAlign=Center headerTextAlign=Center ></e-grid-column> - <e-grid-column headerText="Operator" field="OperatorName" type="string" textAlign=Center headerTextAlign=Center></e-grid-column> - <e-grid-column headerText="Ko'rik vaqti" field="Date" type="date" format="dd-MM-yyyy | HH:mm" textAlign=Center headerTextAlign=Center></e-grid-column> - <e-grid-column type="text" textAlign="Center" template="#actionTemplate"></e-grid-column> - </e-grid-columns> - </ejs-grid> - </div> -</div> - -<script> - let selectedYear = new Date().getFullYear(); - let selectedMonth = new Date().getMonth() + 1; - - function valueChange(args) { - var selectedDate = args.value; - selectedYear = selectedDate.getFullYear(); - selectedMonth = selectedDate.getMonth() + 1; - - document.getElementById('date_label').textContent = 'Выбранное значение: ' + selectedDate.toDateString(); - } - - document.getElementById('dropdownMenu').addEventListener('click', function (event) { - event.stopPropagation(); - }); - - document.getElementById('downloadButton').addEventListener('click', function (e) { - e.preventDefault(); - - const url = `/DispatcherReviews/Download?year=${selectedYear}&month=${selectedMonth}`; - - const link = document.createElement('a'); - link.href = url; - link.setAttribute('download', ''); - document.body.appendChild(link); - link.click(); - document.body.removeChild(link); - - const dropdown = bootstrap.Dropdown.getInstance(document.getElementById('dropdownMenuButton')); - dropdown.hide(); - }); - - function onDataBound() { - const headers = document.querySelectorAll('#dispatcherReview-list .e-headercell'); - - headers.forEach(header => { - header.setAttribute('title', header.innerText.trim()); - }); - } -</script> - -<script type="text/x-template" id="actionTemplate"> - <button type="button" class="shadow-sm bg-white rounded e-btn e-flat mx-2" title="Tafsilot" onclick="onDetailsClick(${Id})"> - <i class="bi bi-card-list text-info" style="font-size: 19px;"></i> - </button> -</script> - -<div class="modal fade" id="detailsModal" tabindex="-1" aria-labelledby="detailsModalLabel" aria-hidden="true"> - <div class="modal-dialog modal-lg"> - <div class="modal-content"> - <div class="modal-header d-flex justify-content-center"> - <h3 class="modal-title" id="detailsModalLabel">Dispetcher ko'rigi ma'lumotlari</h3> - <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button> - </div> - <div class="modal-body" id="detailsContent"> - </div> - </div> - </div> -</div> - -<script> - function onDetailsClick(id) { - $('#detailsContent').empty(); - $.ajax({ - url: `/dispatcherReviews/details/${id}`, - type: 'GET', - contentType: 'application/x-www-form-urlencoded; charset=UTF-8', - success: function (data) { - $('#detailsContent').html(data); - var detailsModal = new bootstrap.Modal(document.getElementById('detailsModal'), { - backdrop: 'static', - keyboard: false - }); - detailsModal.show(); - }, - error: function (error) { - alert("Ma'lumotlarni yuklashda muammo yuz berdi."); - } - }); - } - - $('#detailsModal').on('hidden.bs.modal', function () { - $(this).find('#detailsContent').empty(); - }); -</script> - -<script> - function onChangeSearchAndDate(args) { - const searchInput = document.getElementById("search-box").value.trim(); - const gridElement = document.getElementById("dispatcherReview-list"); - const gridInstance = gridElement?.ej2_instances?.[0]; - - if (!gridInstance) { - console.error("Grid instance not found."); - return; - } - - if (searchInput) { - gridInstance.search(searchInput); - } else { - gridInstance.searchSettings.key = ""; - } - - gridInstance.refresh(); - } -</script> - -<style> - .e-input-group input { - height: 35px !important; - } - - .search-box { - padding-left: 2rem; - } - - .position-relative .fa-magnifying-glass { - pointer-events: none; - z-index: 1; - } - - button { - height: 37px; - } - - .e-pager .e-pagerexternalmsg { - display: none; - } - - .modal-content { - width: 90%; - } -</style> \ No newline at end of file diff --git a/CheckDrive.Web/CheckDrive.Web/Views/DispatcherReviews/PersonalIndex.cshtml b/CheckDrive.Web/CheckDrive.Web/Views/DispatcherReviews/PersonalIndex.cshtml deleted file mode 100644 index 3e727b0d..00000000 --- a/CheckDrive.Web/CheckDrive.Web/Views/DispatcherReviews/PersonalIndex.cshtml +++ /dev/null @@ -1,238 +0,0 @@ -@model IEnumerable<CheckDrive.ApiContracts.DispatcherReview.DispatcherReviewDto> -<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-icons/1.10.0/font/bootstrap-icons.min.css"> -<link rel="stylesheet" href="~/css/LogOutButtun.css" asp-append-version="true" /> -@{ - ViewData["Title"] = "PersonalIndex"; - Layout = "~/Views/Shared/_PersonalLayout.cshtml"; -} - -<div class="container mt-5" style="max-width: 100%;"> - <div class="mb-4 d-flex justify-content-between align-items-center"> - <div class="gap-2"> - <button class="btn btn-outline-info dropdown-toggle" type="button" id="dropdownMenuButton" data-bs-toggle="dropdown" aria-expanded="false"> - <i class="fa-solid fa-download"></i> Yuklab olish - </button> - <div class="dropdown-menu p-3" id="dropdownMenu" aria-labelledby="dropdownMenuButton" data-bs-auto-close="outside"> - <ejs-calendar id="calendar" change="valueChange" Start="Year" Depth="Year"></ejs-calendar> - <a class="dropdown-item mt-2 btn btn-info" href="#" id="downloadButton">Yuklash</a> - </div> - </div> - </div> - <div class="table-responsive"> - <table class="table table-bordered table-striped table-hover paper-shadow" style="width: 100%;"> - <thead> - <tr> - <th class="text-center vertical-align-middle" style="min-width: 150px;">Haydovchi F.I.</th> - <th class="text-center vertical-align-middle" style="min-width: 150px;">Moshina</th> - <th class="text-center vertical-align-middle" style="min-width: 200px;">Yoqilg`i meyori</th> - <th class="text-center vertical-align-middle" style="min-width: 150px;">Boshlang`ich yoqilg`i qoldig`i</th> - <th class="text-center vertical-align-middle" style="min-width: 150px;">Boshlang`ich masofa</th> - <th class="text-center vertical-align-middle" style="min-width: 150px;">Yakuniy masofa</th> - <th class="text-center vertical-align-middle" style="min-width: 150px;">Masofa</th> - <th class="text-center vertical-align-middle" style="min-width: 150px;">Sarflagan yoqilg`i</th> - <th class="text-center vertical-align-middle" style="min-width: 150px;">Quyilgan yoqilg`i</th> - <th class="text-center vertical-align-middle" style="min-width: 150px;">Qolgan yoqilg`i qoldig`i</th> - <th class="text-center vertical-align-middle" style="min-width: 150px;">Operator F.I.</th> - <th class="text-center vertical-align-middle" style="min-width: 150px;">Mexanik F.I.</th> - <th class="text-center vertical-align-middle" style="min-width: 150px;">Sana</th> - </tr> - </thead> - <tbody> - @if (Model != null && Model.Any()) - { - @foreach (var review in Model) - { - <tr> - <td class="text-center vertical-align-middle">@review.DriverName</td> - <td class="text-center vertical-align-middle">@review.CarName</td> - <td class="text-center vertical-align-middle">@review.CarMeduimFuelConsumption</td> - <td class="text-center vertical-align-middle">@review.RemainigFuelBefore</td> - <td class="text-center vertical-align-middle">@review.InitialDistance</td> - <td class="text-center vertical-align-middle">@review.FinalDistance</td> - <td class="text-center vertical-align-middle"> - @if (review.DispatcherId != 0) - { - @review.DistanceCovered - } - else - { - <a href="@Url.Action("Create", new {distanceCovered = review.DistanceCovered, fuelSpended = review.FuelSpended, operatorId = review.OperatorId, mechanicId = review.MechanicId, driverId = review.DriverId, mechanicHandoverId = review.MechanicHandoverId, mechanicAcceptanceId = review.MechanicAcceptanceId, carId = review.CarId, operatorReviewId = review.OperatorReviewId })"> - @review.DistanceCovered - </a> - } - </td> - <td class="text-center vertical-align-middle"> - @if (review.DispatcherId != 0) - { - @String.Format("{0:F4}", review.FuelSpended) - } - else - { - <a href="@Url.Action("Create", new {distanceCovered = review.DistanceCovered, fuelSpended = review.FuelSpended, operatorId = review.OperatorId, mechanicId = review.MechanicId, driverId = review.DriverId, mechanicHandoverId = review.MechanicHandoverId, mechanicAcceptanceId = review.MechanicAcceptanceId, carId = review.CarId, operatorReviewId = review.OperatorReviewId })"> - @String.Format("{0:F3}", review.FuelSpended) - </a> - } - </td> - <td class="text-center vertical-align-middle">@review.PouredFuel</td> - <td class="text-center vertical-align-middle">@String.Format("{0:F3}", review.RemainigFuelAfter)</td> - <td class="text-center vertical-align-middle">@review.OperatorName</td> - <td class="text-center vertical-align-middle">@review.MechanicName</td> - <td class="text-center vertical-align-middle">@review.Date</td> - </tr> - } - } - else - { - <tr> - <td colspan="14" class="text-center"> - Maʼlumotlar mavjud emas - </td> - </tr> - } - </tbody> - </table> - <div class="d-flex justify-content-between align-items-center my-2"> - <nav aria-label="Page navigation"> - <ul class="pagination"> - @if (ViewBag.HasPreviousPage) - { - <li class="page-item"> - <a class="page-link" href="@Url.Action("PersonalIndex", new { pageNumber = 1 })" aria-label="First"> - <span aria-hidden="true">«</span> - </a> - </li> - <li class="page-item"> - <a class="page-link" href="@Url.Action("PersonalIndex", new { pageNumber = ViewBag.CurrentPage - 1 })">@(@ViewBag.CurrentPage - 1)</a> - </li> - } - @if (ViewBag.HasNextPage) - { - <li class="page-item active"> - <span class="page-link">@ViewBag.CurrentPage</span> - </li> - <li class="page-item"> - <a class="page-link" href="@Url.Action("PersonalIndex", new { pageNumber = ViewBag.CurrentPage + 1 })">@(@ViewBag.CurrentPage + 1)</a> - </li> - <li class="page-item"> - <a class="page-link" href="@Url.Action("PersonalIndex", new { pageNumber = ViewBag.PageCount })" aria-label="Last"> - <span aria-hidden="true">»</span> - </a> - </li> - } - </ul> - </nav> - <div class="p-2"> - <p class="h6 mb-0">@ViewBag.PageCount sahifadan @ViewBag.CurrentPage tasi ( umumiy ishchilar soni: @ViewBag.TotalCount)</p> - </div> - </div> - </div> -</div> - -<style> - .nav-tabs .nav-link.active { - background-color: #007bff; - color: white; - } - - .nav-tabs .nav-link { - border: 1px solid #dee2e6; - } - .badge { - font-size: 0.8rem; - padding: 5px 10px; - border-radius: 5px; - } - - .bg-success { - background-color: #28a745; - } - - .bg-danger { - background-color: #dc3545; - } - - .bg-secondary { - background-color: #6c757d; - } - - .container { - margin-top: 30px; - max-width: 100%; - } - - .table-bordered { - border: 1px solid #dee2e6; - } - - .table-bordered th, - .table-bordered td { - border: 1px solid #dee2e6; - } - - .paper-shadow { - background: white; - box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); - border-radius: 10px; - } - - .pagination { - justify-content: flex-end; - } - - .shadow { - box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); - } - - .pagination .page-link { - margin-left: 5px; - } - - .pagination .page-item.shadow { - box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); - } - - .vertical-align-middle { - vertical-align: middle !important; - } -</style> - -<script> - // Default selected year and month - let selectedYear = new Date().getFullYear(); // Current year - let selectedMonth = new Date().getMonth() + 1; // Current month (months are zero-based) - - // Function to handle the change event in the calendar - function valueChange(args) { - var selectedDate = args.value; - selectedYear = selectedDate.getFullYear(); - selectedMonth = selectedDate.getMonth() + 1; // Months are zero-based - - // Optionally, update a label to display the selected date (if you have one) - document.getElementById('date_label').textContent = 'Выбранное значение: ' + selectedDate.toDateString(); - } - - // Prevent the dropdown from closing when clicking inside - document.getElementById('dropdownMenu').addEventListener('click', function (event) { - event.stopPropagation(); // Stops the dropdown from closing when interacting with its contents - }); - - // Handle the download button click - document.getElementById('downloadButton').addEventListener('click', function (e) { - e.preventDefault(); // Prevent the default action of the link - - // Construct the download URL using the selected year and month - const url = `/DispatcherReviews/Download?year=${selectedYear}&month=${selectedMonth}`; - - // Create a temporary link to trigger the download - const link = document.createElement('a'); - link.href = url; - link.setAttribute('download', ''); // Add download attribute to force download - document.body.appendChild(link); - link.click(); - document.body.removeChild(link); // Clean up - - // Manually close the dropdown after downloading - const dropdown = bootstrap.Dropdown.getInstance(document.getElementById('dropdownMenuButton')); - dropdown.hide(); - }); -</script> \ No newline at end of file diff --git a/CheckDrive.Web/CheckDrive.Web/Views/DoctorReviews/Create.cshtml b/CheckDrive.Web/CheckDrive.Web/Views/DoctorReviews/Create.cshtml deleted file mode 100644 index e1ad2e41..00000000 --- a/CheckDrive.Web/CheckDrive.Web/Views/DoctorReviews/Create.cshtml +++ /dev/null @@ -1,116 +0,0 @@ -@model CheckDrive.ApiContracts.DoctorReview.DoctorReviewForCreateDto - -@{ - ViewData["Title"] = "Create"; - Layout = "~/Views/Shared/_LayoutForModal.cshtml"; - bool noDriversAvailable = ViewBag.Drivers == null || !((IEnumerable<SelectListItem>)ViewBag.Drivers.Items).Any(); -} -<form asp-action="Create" method="post" id="createDoctorReviewForm"> - <div class="row mt-custom" > - <div class="col-md-4 mt-3" style="width:400px"> - @if (noDriversAvailable) - { - <div class="alert alert-warning"> - <strong>Diqqat!</strong> Hozirda mavjud haydovchilar yo'q. Iltimos, keyinroq qayta urinib ko'ring. - </div> - } - - <fieldset @(noDriversAvailable ? "disabled" : "")> - <div asp-validation-summary="ModelOnly" class="text-danger"></div> - <div class="form-group w-75 mt-3"> - <label asp-for="DriverId">Haydovchi F.I.</label> - @if (ViewBag.SelectedDriverId != null && ViewBag.SelectedDriverId != 0) - { - <select class="form-control border border-dark" style="width:400px" disabled> - <option value="@ViewBag.SelectedDriverId" selected="selected">@ViewBag.SelectedDriverName</option> - </select> - <input type="hidden" asp-for="DriverId" value="@ViewBag.SelectedDriverId" /> - } - else - { - @if (ViewBag.Drivers == null || !((IEnumerable<SelectListItem>)ViewBag.Drivers).Any()) - { - <select class="form-control border border-dark" style="width:400px" disabled> - <option selected>Haydovchilar mavjud emas</option> - </select> - } - else - { - <select asp-for="DriverId" class="form-control border border-dark form-select" style="width:400px" asp-items="@ViewBag.Drivers"></select> - } - } - </div> - <div class="form-check form-switch mt-3"> - <input asp-for="IsHealthy" class="form-check-input " type="checkbox" role="switch" id="flexSwitchCheckDefault" value="true"> - <label asp-for="IsHealthy" class="form-check-label" for="flexSwitchCheckDefault">Sog`ligi</label> - <div id="checkboxError" class="text-danger d-none"></div> - </div> - <div class="form-group w-75"> - <select asp-for="DoctorId" class="form-control border border-dark d-none" asp-items="@ViewBag.Doctors"></select> - <input type="hidden" asp-for="DoctorId" value="@ViewBag.DoctorId" /> - </div> - <div class="form-group justify-content-center mt-3"> - <label asp-for="Comments" for="exampleFormControlTextarea1">Izoh</label> - <textarea asp-for="Comments" class="form-control" rows="4"></textarea> - </div> - </fieldset> - <div class="form-group justify-content-center d-flex mt-4"> - <button class="btn btn-success w-25" type="submit" id="submitButton" @(noDriversAvailable ? "disabled" : "")> - Saqlash - </button> - </div> - </div> - </div> -</form> - -<script> - document.addEventListener('DOMContentLoaded', function () { - var form = document.getElementById('createDoctorReviewForm'); - var checkbox = document.getElementById('flexSwitchCheckDefault'); - var checkboxError = document.getElementById('checkboxError'); - - if (!checkbox.checked) { - checkbox.classList.add('is-invalid'); - checkboxError.classList.remove('d-none'); - } - - form.addEventListener('submit', function () { - if (!checkbox.checked) { - checkbox.classList.add('is-invalid'); // Add invalid class - checkboxError.classList.remove('d-none'); // Show error message - } else { - checkbox.classList.remove('is-invalid'); // Remove invalid class - checkboxError.classList.add('d-none'); // Hide error message - } - }); - - checkbox.addEventListener('change', function () { - if (checkbox.checked) { - checkbox.classList.remove('is-invalid'); - checkboxError.classList.add('d-none'); - } else { - checkbox.classList.add('is-invalid'); - checkboxError.classList.remove('d-none'); - } - }); - }); -</script> - -<style> - .is-invalid { - border-color: red !important; - background-color: #f8d7da !important; - } - - - fieldset[disabled] .form-control, - fieldset[disabled] .btn { - background-color: #e9ecef; - cursor: not-allowed; - } - - fieldset[disabled] .form-control:disabled, - fieldset[disabled] .btn:disabled { - opacity: 1; - } -</style> diff --git a/CheckDrive.Web/CheckDrive.Web/Views/DoctorReviews/Delete.cshtml b/CheckDrive.Web/CheckDrive.Web/Views/DoctorReviews/Delete.cshtml deleted file mode 100644 index 30620ca9..00000000 --- a/CheckDrive.Web/CheckDrive.Web/Views/DoctorReviews/Delete.cshtml +++ /dev/null @@ -1,67 +0,0 @@ -@model CheckDrive.ApiContracts.DoctorReview.DoctorReviewDto - -@{ - ViewData["Title"] = "Delete"; -} - -<h1 class="align-items-baseline" style="margin-top: 100px">O'chirish</h1> -<hr /> - -<h3 style="color:grey;"> - Haqiqatan ham buni oʻchirib tashlamoqchimisiz? - O'chirsangiz bu ma`lumotni qayta tiklay olmaysiz!!! -</h3> -<div> - <hr /> - <dl class="row"> - <dt class="col-sm-2"> - Id: - </dt> - <dd class="col-sm-10"> - @Html.DisplayFor(model => model.Id) - </dd> - <dt class="col-sm-2"> - Haydovchi F.I.: - </dt> - <dd class="col-sm-10"> - @Html.DisplayFor(model => model.DriverName) - </dd> - <dt class="col-sm-2"> - Shifokor F.I.: - </dt> - <dd class="col-sm-10"> - @Html.DisplayFor(model => model.DoctorName) - </dd> - <dt class="col-sm-2"> - Sog`lig`i: - </dt> - <dd class="col-sm-10"> - @(Model.IsHealthy.HasValue ? (Model.IsHealthy.Value ? "Sog`lom" : "Kasal") : "N/A") - </dd> - <dt class="col-sm-2"> - Izoh: - </dt> - <dd class="col-sm-10"> - @Html.DisplayFor(model => model.Comments) - </dd> - <dt class="col-sm-2"> - Sana: - </dt> - <dd class="col-sm-10"> - @Html.DisplayFor(model => model.Date) - </dd> - </dl> - - <form asp-action="Delete"> - <div class="form-group"> - <a asp-action="Index" class="btn btn-outline-info"> - <i class="fa-solid fa-arrow-left-long"></i> - Orqaga - </a> - <button asp-route-itemid="@Model.Id" class="btn btn-outline-danger"> - <i class="fa-solid fa-trash"></i> - O'chirish - </button> - </div> - </form> -</div> diff --git a/CheckDrive.Web/CheckDrive.Web/Views/DoctorReviews/Details.cshtml b/CheckDrive.Web/CheckDrive.Web/Views/DoctorReviews/Details.cshtml deleted file mode 100644 index 98078319..00000000 --- a/CheckDrive.Web/CheckDrive.Web/Views/DoctorReviews/Details.cshtml +++ /dev/null @@ -1,55 +0,0 @@ -@model CheckDrive.ApiContracts.DoctorReview.DoctorReviewDto - -@{ - ViewData["Title"] = "Details"; - Layout = null; -} - -<div class="grid-container mt-3"> - <div class="row content"> - <div class="col text-center"> - Haydovchi F.I.SH - </div> - <div class="col text-center"> - Shifokor F.I.SH - </div> - </div> - <div class="row value"> - <div class="col text-center"> - @Model.DriverName - </div> - <div class="col text-center"> - @Model.DoctorName - </div> - </div> - <div class="row content"> - <div class="col text-center"> - Sog'lig'i - </div> - <div class="col text-center"> - Sana - </div> - </div> - <div class="row value"> - <div class="col text-center"> - @(Model.IsHealthy.HasValue ? (Model.IsHealthy.Value ? "Sog`lom" : "Kasal") : "N/A") - </div> - <div class="col text-center"> - @Model.Date - </div> - </div> - <div class="row content"> - <div class="col text-center"> - Izoh - </div> - </div> - <div class="row comments"> - <div class="col text-center"> - @if (string.IsNullOrWhiteSpace(Model.Comments)) - { - Model.Comments = "Izoh mavjud emas"; - } - @Model.Comments - </div> - </div> -</div> \ No newline at end of file diff --git a/CheckDrive.Web/CheckDrive.Web/Views/DoctorReviews/Edit.cshtml b/CheckDrive.Web/CheckDrive.Web/Views/DoctorReviews/Edit.cshtml deleted file mode 100644 index 37c9b2ad..00000000 --- a/CheckDrive.Web/CheckDrive.Web/Views/DoctorReviews/Edit.cshtml +++ /dev/null @@ -1,48 +0,0 @@ -@model CheckDrive.ApiContracts.DoctorReview.DoctorReviewDto - -@{ - ViewData["Title"] = "Edit"; - bool isHealthyNonNullable = Model.IsHealthy ?? false; -} - -<h4>Ma`lumotni tahrirlash</h4> -<hr /> -<div class="row"> - <div class="col-md-4"> - <form asp-action="Edit"> - <div asp-validation-summary="ModelOnly" class="text-danger"></div> - - <div class="form-check form-switch mt-3"> - <input class="form-check-input" type="checkbox" @(isHealthyNonNullable ? "checked" : "") onchange="document.getElementById('IsHealthy').value = this.checked.toString()" /> - <label class="form-check-label">Sog`ligi</label> - </div> - - <input type="hidden" id="IsHealthy" name="IsHealthy" value="@Model.IsHealthy.ToString()" /> - - <div class="form-group mt-3"> - <label asp-for="DriverId" class="control-label">Haydovchi F.I.</label> - <select asp-for="DriverId" class="form-control" asp-items="ViewBag.DriverSelectList"></select> - <span asp-validation-for="DriverId" class="text-danger"></span> - </div> - <div class="form-group mt-3"> - <label asp-for="Date" class="control-label">Sana</label> - <input asp-for="Date" class="form-control" /> - <span asp-validation-for="Date" class="text-danger"></span> - </div> - <div class="form-group mt-2"> - <label asp-for="Comments" class="control-label mt-2">Izoh</label> - <textarea asp-for="Comments" class="form-control" rows="4"></textarea> - </div> - <input type="hidden" asp-for="DoctorId" /> - <div class="form-group mt-3"> - <a asp-action="Details" asp-route-id="@Model?.Id" class="btn btn-outline-info"> - <i class="fa-solid fa-arrow-left-long"></i> - Orqaga - </a> - <button class="btn btn-outline-success"> - <i class="fa fa-pencil"></i> Saqlash - </button> - </div> - </form> - </div> -</div> \ No newline at end of file diff --git a/CheckDrive.Web/CheckDrive.Web/Views/DoctorReviews/HistoryIndexForPersonalPage.cshtml b/CheckDrive.Web/CheckDrive.Web/Views/DoctorReviews/HistoryIndexForPersonalPage.cshtml deleted file mode 100644 index 5b47cad6..00000000 --- a/CheckDrive.Web/CheckDrive.Web/Views/DoctorReviews/HistoryIndexForPersonalPage.cshtml +++ /dev/null @@ -1,125 +0,0 @@ -@model IEnumerable<CheckDrive.ApiContracts.DoctorReview.DoctorReviewDto> -<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-icons/1.10.0/font/bootstrap-icons.min.css"> -<link rel="stylesheet" href="~/css/LogOutButtun.css" asp-append-version="true" /> -@{ - ViewData["Title"] = "HistoryIndexForPersonalPage"; - Layout = "~/Views/Shared/_PersonalLayout.cshtml"; -} - -<form asp-controller="DoctorReviews" asp-action="HistoryIndexForPersonalPage"> - <div class="container mt-5 "> - - <div class="row justify-content-between align-items-center mb-4"> - <!-- Search --> - <div class="col-md-4"> - <div class="input-group"> - <input type="text" class="form-control rounded-left" placeholder="Haydovchini qidirish ..." name="searchString" value="@ViewBag.SearchString"> - <div class="input-group-append"> - <button type="submit" class="btn btn-primary"> - <i class="fa fa-search"></i> Qidirish - </button> - </div> - </div> - </div> - <div class="col-md-2"> - <input type="date" name="date" class="form-control"> - </div> - </div> - - <div class="row justify-content-center"> - <div class="col-md-12"> - <div class="table-responsive"> - <table class="table table-bordered table-striped table-hover paper-shadow"> - <thead> - <tr> - <th class="text-center vertical-align-middle">Haydovchi F.I.</th> - <th class="text-center vertical-align-middle">Sog`lig`i</th> - <th class="text-center vertical-align-middle">Izoh</th> - <th class="text-center vertical-align-middle">Sana</th> - </tr> - </thead> - <tbody> - @if (Model != null && Model.Any()) - { - @foreach (var review in Model) - { - <tr> - <td class="text-center vertical-align-middle">@review.DriverName</td> - <td class="text-center vertical-align-middle"> - @if (!string.IsNullOrEmpty(review.DoctorName)) - { - @if (review.IsHealthy == true) - { - <span class="badge bg-success shadow">Sog`lom</span> - } - else if (review.IsHealthy == false) - { - <span class="badge bg-danger shadow">Kasal</span> - } - } - </td> - <td class="text-center vertical-align-middle">@review.Comments</td> - <td class="text-center vertical-align-middle">@review.Date</td> - </tr> - } - } - else - { - <tr> - <td colspan="5" class="text-center"> - Maʼlumotlar mavjud emas - </td> - </tr> - } - </tbody> - </table> - - <div class="d-flex justify-content-between align-items-center my-2"> - <nav aria-label="Page navigation"> - <ul class="pagination"> - @if (ViewBag.HasPreviousPage) - { - <li class="page-item"> - <a class="page-link" href="@Url.Action("HistoryIndexForPersonalPage", new { pageNumber = 1 })" aria-label="First"> - <span aria-hidden="true">«</span> - </a> - </li> - <li class="page-item"> - <a class="page-link" href="@Url.Action("HistoryIndexForPersonalPage", new { pageNumber = ViewBag.CurrentPage - 1 })">@(@ViewBag.CurrentPage - 1)</a> - </li> - } - @if (ViewBag.HasNextPage) - { - <li class="page-item active"> - <span class="page-link">@ViewBag.CurrentPage</span> - </li> - <li class="page-item"> - <a class="page-link" href="@Url.Action("HistoryIndexForPersonalPage", new { pageNumber = ViewBag.CurrentPage + 1 })">@(@ViewBag.CurrentPage + 1)</a> - </li> - <li class="page-item"> - <a class="page-link" href="@Url.Action("HistoryIndexForPersonalPage", new { pageNumber = ViewBag.PageCount })" aria-label="Last"> - <span aria-hidden="true">»</span> - </a> - </li> - } - </ul> - </nav> - <div class="p-2"> - <p class="h6 mb-0">@ViewBag.PageCount sahifadan @ViewBag.CurrentPage tasi ( umumiy tarixlar soni: @ViewBag.TotalCount)</p> - </div> - </div> - </div> - </div> - </div> - </div> -</form> -<style> - .nav-tabs .nav-link.active { - background-color: #007bff; - color: white; - } - - .nav-tabs .nav-link { - border: 1px solid #dee2e6; - } -</style> diff --git a/CheckDrive.Web/CheckDrive.Web/Views/DoctorReviews/Index.cshtml b/CheckDrive.Web/CheckDrive.Web/Views/DoctorReviews/Index.cshtml deleted file mode 100644 index a1d003bb..00000000 --- a/CheckDrive.Web/CheckDrive.Web/Views/DoctorReviews/Index.cshtml +++ /dev/null @@ -1,162 +0,0 @@ -@model CheckDrive.ApiContracts.DoctorReview.DoctorReviewDto - -@{ - ViewData["Title"] = "Index"; - Layout = "~/Views/Shared/_Layout.cshtml"; -} - -<form asp-controller="DoctorReviews" asp-action="Index"> - <div class="row mt-4"> - <div class="d-flex justify-content-between mb-4"> - <div class="col-md-4 filter-bar position-relative"> - <div class="position-relative w-100"> - <i class="fa-solid fa-magnifying-glass position-absolute top-50 start-0 translate-middle-y ms-3" style="color: dimgray;"></i> - <ejs-textbox id="search-box" - name="search" - class="search-box ps-5" - placeholder="Izlash..." - floatLabelType="Never" - value="@ViewBag.SearchString" - input="onChangeSearchAndDate"> - </ejs-textbox> - </div> - </div> - <div class="col-md-2 date-filter"> - <ejs-datepicker id="date" - format="dd-MM-yyyy" - placeholder="Sanani tanlang" - floatLabelType="Never"> - </ejs-datepicker> - </div> - </div> - </div> -</form> - -<div class="row"> - <div class="col-12"> - <ejs-grid - id="doctorReview-list" - dataSource="@ViewBag.DoctorsReview" - gridLines="Both" - allowSorting="true" - allowPaging="true" - dataBound="onDataBound"> - <e-grid-pagesettings pageSize="10"></e-grid-pagesettings> - <e-grid-columns> - <e-grid-column headerText="Shifokor" field="DoctorName" type="string" textAlign=Center headerTextAlign=Center width="300"></e-grid-column> - <e-grid-column headerText="Haydovchi" field="DriverName" type="string" textAlign=Center headerTextAlign=Center width="300"></e-grid-column> - <e-grid-column headerText="Ko'rik vaqti" field="Date" type="date" format="dd-MM-yyyy | HH:mm" textAlign=Center headerTextAlign=Center></e-grid-column> - <e-grid-column headerText="Sog'ligi" field="IsHealthy" template="#booleanColumnTemplate" textAlign=Center headerTextAlign=Center></e-grid-column> - <e-grid-column width="100" type="text" textAlign="Center" template="#actionTemplate"></e-grid-column> - </e-grid-columns> - </ejs-grid> - </div> -</div> - - -<script> - function onDataBound() { - const headers = document.querySelectorAll('#doctorReview-list .e-headercell'); - - headers.forEach(header => { - header.setAttribute('title', header.innerText.trim()); - }); - } -</script> - -<script id="booleanColumnTemplate" type="text/x-template"> - ${if(IsHealthy == 0)} - <span class="badge bg-danger">Kasal</span> - ${else if(IsHealthy == 1)} - <span class="badge bg-success">Sog'lom</span> - ${/if} -</script> - -<script type="text/x-template" id="actionTemplate"> - <button type="button" class="shadow-sm bg-white rounded e-btn e-flat mx-2" title="Tafsilot" onclick="onDetailsClick(${Id})"> - <i class="bi bi-card-list text-info" style="font-size: 19px;"></i> - </button> -</script> - -<div class="modal fade" id="detailsModal" tabindex="-1" aria-labelledby="detailsModalLabel" aria-hidden="true"> - <div class="modal-dialog modal-lg"> - <div class="modal-content"> - <div class="modal-header d-flex justify-content-center"> - <h3 class="modal-title" id="detailsModalLabel">Shifokor ko'rigi haqida ma'lumot</h3> - <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button> - </div> - <div class="modal-body" id="detailsContent"> - </div> - </div> - </div> -</div> - -<script> - function onDetailsClick(id) { - $('#detailsContent').empty(); - $.ajax({ - url: `/doctorReviews/details/${id}`, - type: 'GET', - contentType: 'application/x-www-form-urlencoded; charset=UTF-8', - success: function (data) { - $('#detailsContent').html(data); - var detailsModal = new bootstrap.Modal(document.getElementById('detailsModal'), { - backdrop: 'static', - keyboard: false - }); - detailsModal.show(); - }, - error: function (error) { - alert("Ma'lumotlarni yuklashda muammo yuz berdi."); - } - }); - } - - $('#detailsModal').on('hidden.bs.modal', function () { - $(this).find('#detailsContent').empty(); - }); -</script> - -<script> - function onChangeSearchAndDate() { - const searchInput = document.getElementById("search-box").value.trim(); - const gridElement = document.getElementById("doctorReview-list"); - const gridInstance = gridElement?.ej2_instances?.[0]; - - if (!gridInstance) { - console.error("Grid instance not found."); - return; - } - - if (searchInput) { - gridInstance.search(searchInput); - } else { - gridInstance.searchSettings.key = ""; - } - - gridInstance.refresh(); - } -</script> - -<style> - .e-input-group input { - height: 35px !important; - } - - .search-box { - padding-left: 2rem; - } - - .position-relative .fa-magnifying-glass { - pointer-events: none; - z-index: 1; - } - - button { - height: 37px; - } - - .e-pager .e-pagerexternalmsg { - display: none; - } -</style> \ No newline at end of file diff --git a/CheckDrive.Web/CheckDrive.Web/Views/DoctorReviews/PersonalIndex.cshtml b/CheckDrive.Web/CheckDrive.Web/Views/DoctorReviews/PersonalIndex.cshtml deleted file mode 100644 index 33a78bd1..00000000 --- a/CheckDrive.Web/CheckDrive.Web/Views/DoctorReviews/PersonalIndex.cshtml +++ /dev/null @@ -1,321 +0,0 @@ -@model IEnumerable<CheckDrive.ApiContracts.DoctorReview.DoctorReviewDto> -<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script> <!-- jQuery --> -<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-icons/1.10.0/font/bootstrap-icons.min.css"> -@{ - ViewData["Title"] = "PersonalIndex"; - Layout = "~/Views/Shared/_PersonalLayout.cshtml"; - -} -<form asp-controller="DoctorReviews" asp-action="PersonalIndex"> - <div class="container mt-5"> - <div class="row justify-content-between align-items-center mb-4"> - <!-- Search --> - <div class="col-md-4"> - <div class="input-group"> - <input type="text" class="form-control rounded-left" placeholder="Haydovchini qidirish ..." name="searchString" value="@ViewBag.SearchString"> - <div class="input-group-append"> - <button type="submit" class="btn btn-primary"> - <i class="fa fa-search"></i> Qidirish - </button> - </div> - </div> - </div> - <div class="col-md-4 text-right"> - <button type="button" class="btn btn-success" id="openCreateModal"> - <i class="fa fa-plus"></i> Yaratish - </button> - - </div> - </div> - <div class="row justify-content-center"> - <div class="col-md-12"> - <div class="table-responsive"> - <table class="table table-bordered table-striped table-hover paper-shadow"> - <thead> - <tr> - <th class="text-center vertical-align-middle">Haydovchi F.I.</th> - <th class="text-center vertical-align-middle">Sana</th> - </tr> - </thead> - <tbody> - @if(Model != null && Model.Any()) - { - @foreach (var review in Model) - { - <tr> - <td class="text-center vertical-align-middle"> - @if (!string.IsNullOrEmpty(review.DoctorName)) - { - @review.DriverName - } - else - { - <a href="javascript:void(0);" - class="openDoctorReviewModal" - data-driver-id="@review.DriverId" - data-driver-name="@review.DriverName"> - @review.DriverName - </a> - } - </td> - <td class="text-center vertical-align-middle">@review.Date.ToString("dd.MM.yyyy")</td> - </tr> - } - } - else - { - <tr> - <td colspan="5" class="text-center"> - Maʼlumotlar mavjud emas - </td> - </tr> - } - </tbody> - </table> - - <div class="d-flex justify-content-between align-items-center my-2"> - <nav aria-label="Page navigation"> - <ul class="pagination"> - @if (ViewBag.HasPreviousPage) - { - <li class="page-item"> - <a class="page-link" href="@Url.Action("PersonalIndex", new { pageNumber = 1 })" aria-label="First"> - <span aria-hidden="true">«</span> - </a> - </li> - <li class="page-item"> - <a class="page-link" href="@Url.Action("PersonalIndex", new { pageNumber = ViewBag.CurrentPage - 1 })">@(@ViewBag.CurrentPage - 1)</a> - </li> - } - @if (ViewBag.HasNextPage) - { - <li class="page-item active"> - <span class="page-link">@ViewBag.CurrentPage</span> - </li> - <li class="page-item"> - <a class="page-link" href="@Url.Action("PersonalIndex", new { pageNumber = ViewBag.CurrentPage + 1 })">@(@ViewBag.CurrentPage + 1)</a> - </li> - <li class="page-item"> - <a class="page-link" href="@Url.Action("PersonalIndex", new { pageNumber = ViewBag.PageCount })" aria-label="Last"> - <span aria-hidden="true">»</span> - </a> - </li> - } - </ul> - </nav> - <div class="p-2"> - <p class="h6 mb-0">@ViewBag.PageCount sahifadan @ViewBag.CurrentPage tasi ( umumiy haydovchilar soni: @ViewBag.TotalCount)</p> - </div> - </div> - </div> - </div> - </div> - </div> -</form> -<!-- Modal oyna --> -<div class="modal fade" id="createDoctorReviewModal" tabindex="-1" aria-labelledby="createDoctorReviewModalLabel" aria-hidden="true" > - <div class="modal-dialog modal-lg "> - <div class="modal-content" style="width:60%"> - <div class="modal-header d-flex justify-content-center"> - <h5 id="createDoctorReviewModalLabel">Ro'yxatga olish</h5> - <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"> - <span aria-hidden="true"></span> - </button> - </div> - <div class="modal-body" id="modalContent"> - <!-- Bu yerga forma yuklanadi --> - </div> - </div> - </div> -</div> - -<script> - $(document).ready(function () { - $('#openCreateModal').on('click', function () { - $('#modalContent').empty(); - $.ajax({ - url: '/doctorreviews/create', - type: 'GET', - contentType: 'application/x-www-form-urlencoded; charset=UTF-8', - headers: { - 'RequestVerificationToken': $('input[name="__RequestVerificationToken"]').val() - }, - success: function (data) { - $('#modalContent').html(data); - $('#createDoctorReviewModal').modal('show'); - var form = document.getElementById('createDoctorReviewForm'); - var checkbox = document.getElementById('flexSwitchCheckDefault'); - var checkboxError = document.getElementById('checkboxError'); - - if (!checkbox.checked) { - checkbox.classList.add('is-invalid'); - checkboxError.classList.remove('d-none'); - } - - form.addEventListener('submit', function () { - if (!checkbox.checked) { - checkbox.classList.add('is-invalid'); // Add invalid class - checkboxError.classList.remove('d-none'); // Show error message - } else { - checkbox.classList.remove('is-invalid'); // Remove invalid class - checkboxError.classList.add('d-none'); // Hide error message - } - }); - - checkbox.addEventListener('change', function () { - if (checkbox.checked) { - checkbox.classList.remove('is-invalid'); - checkboxError.classList.add('d-none'); - } else { - checkbox.classList.add('is-invalid'); - checkboxError.classList.remove('d-none'); - } - }); - }, - error: function () { - alert('Yaratish formani yuklashda xatolik yuz berdi.'); - } - }); - }); - }); - $('#createDoctorReviewModal').on('hidden.bs.modal', function () { - $(this).find('#modalContent').empty(); // Modal yopilganda ichki kontentni tozalash - }); -</script> - -<script> - $(document).ready(function () { - $('.openDoctorReviewModal').click(function (e) { - e.preventDefault(); - console.log("F.I.O link bosildi"); - var driverId = $(this).data('driver-id'); - var driverName = $(this).data('driver-name'); - - console.log("Driver ID: ", driverId); - console.log("Driver Name: ", driverName); - - $.ajax({ - url: "/doctorreviews/create?driverid=" + driverId + "&driverName=" + driverName, - type: 'GET', - data: { id: driverId }, - success: function (data) { - // Modal oynaga ma'lumotlarni joylashtirish - $('#modalContent').html(data); - // Modalni ochish - $('#createDoctorReviewModal').modal('show'); - var form = document.getElementById('createDoctorReviewForm'); - var checkbox = document.getElementById('flexSwitchCheckDefault'); - var checkboxError = document.getElementById('checkboxError'); - - if (!checkbox.checked) { - checkbox.classList.add('is-invalid'); - checkboxError.classList.remove('d-none'); - } - - form.addEventListener('submit', function () { - if (!checkbox.checked) { - checkbox.classList.add('is-invalid'); // Add invalid class - checkboxError.classList.remove('d-none'); // Show error message - } else { - checkbox.classList.remove('is-invalid'); // Remove invalid class - checkboxError.classList.add('d-none'); // Hide error message - } - }); - - checkbox.addEventListener('change', function () { - if (checkbox.checked) { - checkbox.classList.remove('is-invalid'); - checkboxError.classList.add('d-none'); - } else { - checkbox.classList.add('is-invalid'); - checkboxError.classList.remove('d-none'); - } - }); - }, - error: function (xhr, status, error) { - // Xatolik yuz berganda - alert('Xatolik: ' + error); - } - }); - }); - }); -</script> - -<style> - .nav-tabs .nav-link.active { - background-color: #007bff; - color: white; - } - - .nav-tabs .nav-link { - border: 1px solid #dee2e6; - } - - .badge { - font-size: 0.8rem; - padding: 5px 10px; - border-radius: 5px; - } - - .container { - margin-top: 30px; - } - - .table-bordered { - border: 1px solid #dee2e6; - } - - .table-bordered th, - .table-bordered td { - border: 1px solid #dee2e6; - } - - .paper-shadow { - background: white; - box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); - border-radius: 10px; - } - - .pagination { - justify-content: flex-end; - } - - .shadow { - box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); - } - - .pagination .page-link { - margin-left: 5px; - } - - .pagination .page-item.shadow { - box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); - } - - .vertical-align-middle { - vertical-align: middle !important; - } - - .row { - margin-right: 0; - margin-left: 0; - } - - .col-md-4, .col-md-12 { - padding-right: 0; - padding-left: 0; - } - - .text-right { - text-align: right; - } - - .btn-secondary { - background-color: #6c757d; - color: white; - } - - .btn-secondary:hover { - background-color: #5a6268; - } -</style> diff --git a/CheckDrive.Web/CheckDrive.Web/Views/Employees/Create.cshtml b/CheckDrive.Web/CheckDrive.Web/Views/Employees/Create.cshtml index b2e1c98b..add642a1 100644 --- a/CheckDrive.Web/CheckDrive.Web/Views/Employees/Create.cshtml +++ b/CheckDrive.Web/CheckDrive.Web/Views/Employees/Create.cshtml @@ -73,7 +73,7 @@ </div> <div class="col-md"> <label asp-for="Email" class="control-label">Elektron pochta</label> - <input id="phoneNumberId" class="form-control" asp-for="Email" /> + <input id="email" class="form-control" asp-for="Email" /> <span asp-validation-for="Email" class="text-danger"></span> </div> </div> diff --git a/CheckDrive.Web/CheckDrive.Web/Views/Employees/Edit.cshtml b/CheckDrive.Web/CheckDrive.Web/Views/Employees/Edit.cshtml index 77d7413e..efde65f0 100644 --- a/CheckDrive.Web/CheckDrive.Web/Views/Employees/Edit.cshtml +++ b/CheckDrive.Web/CheckDrive.Web/Views/Employees/Edit.cshtml @@ -74,7 +74,11 @@ </div> <div class="col-md"> <label asp-for="AssignedCarId" class="control-label">Avtomobil</label> - <select id="assigned-car-select" class="form-select form-control border" name="AssignedCarId" asp-for="AssignedCarId" asp-items="@ViewBag.Cars"></select> + <select id="assigned-car-select" class="form-select form-control border" + name="AssignedCarId" asp-for="AssignedCarId" + asp-items="@(Model.Position.ToString() == "Driver" ? ViewBag.Cars : new SelectList(Enumerable.Empty<SelectListItem>()))" + disabled=@(Model.Position.ToString() != "Driver" ? "disabled" : null)> + </select> <span asp-validation-for="AssignedCarId" class="text-danger"></span> </div> </div> diff --git a/CheckDrive.Web/CheckDrive.Web/Views/Employees/Index.cshtml b/CheckDrive.Web/CheckDrive.Web/Views/Employees/Index.cshtml index ea2e572f..a22a7999 100644 --- a/CheckDrive.Web/CheckDrive.Web/Views/Employees/Index.cshtml +++ b/CheckDrive.Web/CheckDrive.Web/Views/Employees/Index.cshtml @@ -32,7 +32,7 @@ <ejs-combobox id="positions-combobox" placeholder="Kasb bo'yicha saralash" floatLabelType="Never" - dataSource="@ViewBag.SelectedPosition" + dataSource="@ViewBag.Positions" value="@ViewBag.SelectedPosition" allowObjectBinding="true" change="searchAndFilter"> diff --git a/CheckDrive.Web/CheckDrive.Web/Views/Shared/Error409.cshtml b/CheckDrive.Web/CheckDrive.Web/Views/Error/Error409.cshtml similarity index 100% rename from CheckDrive.Web/CheckDrive.Web/Views/Shared/Error409.cshtml rename to CheckDrive.Web/CheckDrive.Web/Views/Error/Error409.cshtml diff --git a/CheckDrive.Web/CheckDrive.Web/Views/Shared/Forbidden.cshtml b/CheckDrive.Web/CheckDrive.Web/Views/Error/Forbidden.cshtml similarity index 100% rename from CheckDrive.Web/CheckDrive.Web/Views/Shared/Forbidden.cshtml rename to CheckDrive.Web/CheckDrive.Web/Views/Error/Forbidden.cshtml diff --git a/CheckDrive.Web/CheckDrive.Web/Views/Shared/InternalServerError.cshtml b/CheckDrive.Web/CheckDrive.Web/Views/Error/InternalServerError.cshtml similarity index 100% rename from CheckDrive.Web/CheckDrive.Web/Views/Shared/InternalServerError.cshtml rename to CheckDrive.Web/CheckDrive.Web/Views/Error/InternalServerError.cshtml diff --git a/CheckDrive.Web/CheckDrive.Web/Views/Shared/NotFound.cshtml b/CheckDrive.Web/CheckDrive.Web/Views/Error/NotFound.cshtml similarity index 100% rename from CheckDrive.Web/CheckDrive.Web/Views/Shared/NotFound.cshtml rename to CheckDrive.Web/CheckDrive.Web/Views/Error/NotFound.cshtml diff --git a/CheckDrive.Web/CheckDrive.Web/Views/Shared/Unauthorized.cshtml b/CheckDrive.Web/CheckDrive.Web/Views/Error/Unauthorized.cshtml similarity index 100% rename from CheckDrive.Web/CheckDrive.Web/Views/Shared/Unauthorized.cshtml rename to CheckDrive.Web/CheckDrive.Web/Views/Error/Unauthorized.cshtml diff --git a/CheckDrive.Web/CheckDrive.Web/Views/Home/Privacy.cshtml b/CheckDrive.Web/CheckDrive.Web/Views/Home/Privacy.cshtml index af4fb195..fd543af9 100644 --- a/CheckDrive.Web/CheckDrive.Web/Views/Home/Privacy.cshtml +++ b/CheckDrive.Web/CheckDrive.Web/Views/Home/Privacy.cshtml @@ -1,5 +1,6 @@ @{ ViewData["Title"] = "Privacy Policy"; + Layout = "~/Views/Shared/_Layout.cshtml"; } <h1>@ViewData["Title"]</h1> diff --git a/CheckDrive.Web/CheckDrive.Web/Views/MechanicAcceptances/CreateByButton.cshtml b/CheckDrive.Web/CheckDrive.Web/Views/MechanicAcceptances/CreateByButton.cshtml deleted file mode 100644 index ee643c2e..00000000 --- a/CheckDrive.Web/CheckDrive.Web/Views/MechanicAcceptances/CreateByButton.cshtml +++ /dev/null @@ -1,182 +0,0 @@ -@model CheckDrive.ApiContracts.MechanicAcceptance.MechanicAcceptanceForCreateDto - -@{ - ViewData["Title"] = "CreateByButton"; - Layout = null; - bool noDriversAvailable = ViewBag.FilteredOperatorResponse == null || !((IEnumerable<dynamic>)ViewBag.FilteredOperatorResponse).Any(); -} - -<div class=" mt-custom"> - <div class="col-md-4 offset-md-1 mt-5" style="width:800px"> - @if (noDriversAvailable) - { - <div class="alert alert-warning form-group w-50 mt-2"> - <strong>Diqqat!</strong> Hozirda mavjud haydovchilar yo'q. Iltimos, keyinroq qayta urinib ko'ring. - </div> - } - - <form asp-action="Create" method="post" id="createFormByButton"> - <fieldset @(noDriversAvailable ? "disabled" : "")> - <div asp-validation-summary="ModelOnly" class="text-danger"></div> - <div class="form-group w-50 mt-2"> - <label asp-for="DriverId" class="control-label mt-2">Haydovchi</label> - <select asp-for="DriverId" class="form-control border border-dark form-select" id="driverSelect"> - @if (noDriversAvailable) - { - <option value="">Haydovchilar mavjud emas</option> - } - else - { - <option value="">Haydovchini tanlang</option> - @foreach (var driver in ViewBag.FilteredOperatorResponse) - { - <option value="@driver.DriverId" data-carid="@driver.CarId" data-carname="@driver.CarName" data-mileage="@driver.CarMileage">@driver.DriverName</option> - } - } - </select> - </div> - <div class="form-group w-50"> - <input type="hidden" asp-for="MechanicId" class="form-control border border-dark" value="@ViewBag.MechanicId" /> - </div> - <div class="form-group w-50 mt-2"> - <label asp-for="CarId" class="control-label mt-2">Mashina</label> - <select asp-for="CarId" class="form-control form-select border border-dark" id="carSelect" disabled> - <option value="">Avtomobil tanlang</option> - </select> - <!-- Hidden field to store selected CarId --> - <input type="hidden" id="carIdInput" name="CarId" /> - </div> - <div class="form-check form-switch mt-3"> - <input asp-for="IsAccepted" class="form-check-input" type="checkbox" role="switch" id="flexSwitchCheckDefault"> - <label asp-for="IsAccepted" class="form-check-label" for="flexSwitchCheckDefault">Soz?</label> - </div> - <div id="distanceGroup" class="form-group w-50 mt-2" style="display: none;"> - <label asp-for="Distance" class="control-label mt-2">Qabul qilish masofasi</label> - <input asp-for="Distance" class="form-control" type="number" min="0" step="1" id="distanceInput" /> - <span asp-validation-for="Distance" class="text-danger"></span> - <span class="distance-validation-message text-danger"></span> - </div> - <div class="form-group w-50 mt-2"> - <label for="remainingFuelInput" class="control-label mt-2">Qolgan yoqilg'i (L)</label> - <input type="number" class="form-control" id="remainingFuelInput" disabled /> - </div> - <div class="form-group w-50 mt-2"> - <label asp-for="Comments" class="control-label mt-2">Izoh</label> - <textarea asp-for="Comments" class="form-control" rows="4"></textarea> - </div> - </fieldset> - <div class="form-group justify-content-center d-flex w-50 mt-3"> - <button style="width:150px" class="btn btn-success" type="submit" id="submitButton" @(noDriversAvailable ? "disabled" : "")> - Saqlash - </button> - </div> - </form> - </div> -</div> - -@section Scripts { - <script type="text/javascript"> - document.addEventListener('DOMContentLoaded', function () { - var checkbox = document.getElementById('flexSwitchCheckDefault'); - var distanceGroup = document.getElementById('distanceGroup'); - var driverSelect = document.getElementById('driverSelect'); - var carSelect = document.getElementById('carSelect'); - var distanceInput = document.getElementById('distanceInput'); - var submitButton = document.getElementById('submitButton'); // Correct button ID - var carIdInput = document.getElementById('carIdInput'); - var remainingFuelInput = document.getElementById('remainingFuelInput'); - var mileage = 0; - - function toggleDistanceInput() { - if (checkbox.checked) { - distanceGroup.style.display = "block"; - } else { - distanceGroup.style.display = "none"; - } - } - - checkbox.addEventListener('change', toggleDistanceInput); - toggleDistanceInput(); // Initial check - - driverSelect.addEventListener('change', function () { - var selectedOption = driverSelect.options[driverSelect.selectedIndex]; - var carId = selectedOption.getAttribute('data-carid'); - var carName = selectedOption.getAttribute('data-carname'); - mileage = parseInt(selectedOption.getAttribute('data-mileage')) || 0; - - if (carId) { - fetch(`/MechanicAcceptances/GetCarDetails?carId=${carId}`) - .then(response => response.json()) - .then(data => { - carIdInput.value = carId; - carSelect.innerHTML = `<option value="${carId}">${carName}</option>`; - distanceInput.value = mileage; - remainingFuelInput.value = data.remainingFuel; - validateDistance(); - }) - .catch(error => console.error('Error fetching car details:', error)); - } else { - carSelect.innerHTML = '<option value="">Avtomobil tanlang</option>'; - distanceInput.value = ''; - remainingFuelInput.value = ''; - } - }); - - distanceInput.addEventListener('input', function () { - validateDistance(); - }); - - function validateDistance() { - var distance = Number(distanceInput.value); - if (distance < mileage) { - distanceInput.classList.add('is-invalid'); - showValidationMessage(`Qabul qilish masofasi avtomobilning oxirgi kiritilgan masofasidan ${mileage} km kam bo'lishi mumkin emas!`); - submitButton.disabled = true; // Disable the correct button - } else { - distanceInput.classList.remove('is-invalid'); - clearValidationMessage(); - submitButton.disabled = false; // Enable the correct button - } - } - - function showValidationMessage(message) { - var errorSpan = document.querySelector('.distance-validation-message'); - if (!errorSpan) { - errorSpan = document.createElement('span'); - errorSpan.className = 'distance-validation-message text-danger'; - distanceInput.parentNode.appendChild(errorSpan); - } - errorSpan.textContent = message; - } - - function clearValidationMessage() { - var errorSpan = document.querySelector('.distance-validation-message'); - if (errorSpan) { - errorSpan.textContent = ''; - } - } - }); - - </script> -} - -<style> - .border-danger { - border: 2px solid red !important; - } - - .text-danger { - color: red !important; - } - - fieldset[disabled] .form-control, - fieldset[disabled] .btn { - background-color: #e9ecef; - cursor: not-allowed; - } - - fieldset[disabled] .form-control:disabled, - fieldset[disabled] .btn:disabled { - opacity: 1; - } -</style> diff --git a/CheckDrive.Web/CheckDrive.Web/Views/MechanicAcceptances/CreateByLink.cshtml b/CheckDrive.Web/CheckDrive.Web/Views/MechanicAcceptances/CreateByLink.cshtml deleted file mode 100644 index c667b5b6..00000000 --- a/CheckDrive.Web/CheckDrive.Web/Views/MechanicAcceptances/CreateByLink.cshtml +++ /dev/null @@ -1,149 +0,0 @@ -@model CheckDrive.ApiContracts.MechanicAcceptance.MechanicAcceptanceForCreateDto - -@{ - ViewData["Title"] = "CreateByLink"; - Layout = "~/Views/Shared/_PersonalLayout.cshtml"; -} - -<div class="row mt-custom"> - <div class="col-md-4 offset-md-1 mt-5"> - <h4>Ro'yxatga olish</h4> - <hr class="w-50" /> - - <form asp-action="Create" method="post" id="createFormByLink"> - <div asp-validation-summary="ModelOnly" class="text-danger"></div> - - <div class="form-group w-50 mt-2"> - <label class="control-label mt-2">Haydovchi</label> - <input type="text" class="form-control" value="@ViewBag.DriverName" disabled /> - <input type="hidden" asp-for="DriverId" value="@ViewBag.DriverId" /> - </div> - - <div class="form-group w-50"> - <input type="hidden" asp-for="MechanicId" value="@ViewBag.MechanicId" /> - </div> - - <div class="form-group w-50 mt-2"> - <label class="control-label mt-2">Mashina</label> - <input type="text" class="form-control" value="@ViewBag.CarName" disabled /> - <input type="hidden" asp-for="CarId" value="@ViewBag.CarId" /> - </div> - - <input type="hidden" id="Mileage" value="@ViewBag.Mileage" /> - - <div class="form-check form-switch mt-3"> - <input asp-for="IsAccepted" class="form-check-input" type="checkbox" role="switch" id="flexSwitchCheckDefault"> - <label asp-for="IsAccepted" class="form-check-label" for="flexSwitchCheckDefault">Soz?</label> - </div> - - <div class="form-group w-50 mt-2" id="distanceFieldGroup"> - <label asp-for="Distance" class="control-label mt-2">Qabul qilish masofasi</label> - <input asp-for="Distance" class="form-control" type="number" min="0" step="1" /> - <span asp-validation-for="Distance" class="text-danger"></span> - <small class="text-danger" id="distanceErrorMessage" style="display: none;">Qabul qilish masofasi avtomobilning oxirgi kiritilgan masofasidan @ViewBag.Mileage km kam bo'lishi mumkin emas!</small> - </div> - - <div class="form-group w-50 mt-2"> - <label class="control-label mt-2">Yoqilg`i qoldig`i</label> - <input type="text" class="form-control" value="@ViewBag.RemainingFuel" disabled /> - </div> - - <div class="form-group w-50 mt-2"> - <label asp-for="Comments" class="control-label mt-2">Izoh</label> - <textarea asp-for="Comments" class="form-control" rows="4"></textarea> - </div> - - <div class="form-group mt-3 w-50 mt-2"> - <a asp-action="PersonalIndex" class="btn btn-outline-info"> - <i class="fa-solid fa-arrow-left-long"></i> Orqaga - </a> - <button class="btn btn-success" type="submit"> - <i class="fa fa-plus"></i> Yaratish - </button> - </div> - </form> - </div> -</div> - -@section Scripts { - <script type="text/javascript"> - document.addEventListener('DOMContentLoaded', function () { - var form = document.getElementById('createFormByLink'); - var mileage = parseInt(document.getElementById('Mileage').value); - var distanceInput = document.querySelector('input[name="Distance"]'); - var distanceErrorMessage = document.getElementById('distanceErrorMessage'); - var checkbox = document.getElementById('flexSwitchCheckDefault'); - var checkboxLabel = document.querySelector('label[for="flexSwitchCheckDefault"]'); - var distanceFieldGroup = document.getElementById('distanceFieldGroup'); - - // Initially hide the Distance field if the checkbox is unchecked - if (!checkbox.checked) { - distanceFieldGroup.style.display = 'none'; - } - - function toggleDistanceField() { - if (checkbox.checked) { - distanceFieldGroup.style.display = 'block'; - distanceInput.value = mileage; // Set the distance input to the car's mileage when shown - } else { - distanceFieldGroup.style.display = 'none'; - distanceErrorMessage.style.display = 'none'; - distanceInput.value = ''; // Clear the distance input when hidden - } - } - - function toggleCheckboxHighlight() { - if (!checkbox.checked) { - checkbox.classList.add('border-danger'); - checkboxLabel.classList.add('text-danger'); - } else { - checkbox.classList.remove('border-danger'); - checkboxLabel.classList.remove('text-danger'); - } - } - - toggleCheckboxHighlight(); - toggleDistanceField(); - - checkbox.addEventListener('change', function () { - toggleCheckboxHighlight(); - toggleDistanceField(); - }); - - distanceInput.addEventListener('input', function () { - var distanceValue = parseInt(distanceInput.value); - - if (distanceValue < mileage) { - distanceErrorMessage.style.display = 'block'; - } else { - distanceErrorMessage.style.display = 'none'; - } - }); - - form.addEventListener('submit', function (event) { - var distanceValue = parseInt(distanceInput.value); - var isGiven = checkbox.checked; - - if (isGiven && (distanceValue < mileage)) { - event.preventDefault(); - distanceErrorMessage.style.display = 'block'; - } - - if (distanceValue === 0 && isGiven) { - event.preventDefault(); - alert("Qabul qilish masofanisini kiritishingiz shart!"); - } - }); - }); - </script> -} - -<style> - .border-danger { - border: 2px solid red !important; - } - - .text-danger { - color: red !important; - } -</style> diff --git a/CheckDrive.Web/CheckDrive.Web/Views/MechanicAcceptances/Delete.cshtml b/CheckDrive.Web/CheckDrive.Web/Views/MechanicAcceptances/Delete.cshtml deleted file mode 100644 index be5f8dda..00000000 --- a/CheckDrive.Web/CheckDrive.Web/Views/MechanicAcceptances/Delete.cshtml +++ /dev/null @@ -1,74 +0,0 @@ -@model CheckDrive.ApiContracts.MechanicAcceptance.MechanicAcceptanceDto - -@{ - ViewData["Title"] = "Delete"; -} - -<h1 class="align-items-baseline" style="margin-top: 100px">O'chirish</h1> -<hr /> - -<h3 style="color:grey;"> - Haqiqatan ham buni oʻchirib tashlamoqchimisiz? - O'chirsangiz bu mashina ishtirok etgan barcha ma'lumotlar ham o'chiriladi!!! -</h3> -<div> - <h4>MechanicAcceptance</h4> - <hr /> - <dl class="row"> - <dt class="col-sm-2"> - Mexanik F.I.SH: - </dt> - <dd class="col-sm-10"> - @Html.DisplayFor(model => model.MechanicName) - </dd> - <dt class="col-sm-2"> - Haydovchi F.I.SH: - </dt> - <dd class="col-sm-10"> - @Html.DisplayFor(model => model.DriverName) - </dd> - <dt class="col-sm-2"> - Avtomobil: - </dt> - <dd class="col-sm-10"> - @Html.DisplayFor(model => model.CarName) - </dd> - <dt class="col-sm-2"> - Qabul qilish: - </dt> - <dd class="col-sm-10"> - @(Model.IsAccepted.HasValue ? (Model.IsAccepted.Value ? "Qabul qilindi" : "Qabul qilinmadi") : "N/A") - </dd> - <dt class="col-sm-2"> - Qabul qilish masofasi: - </dt> - <dd class="col-sm-10"> - @Html.DisplayFor(model => model.Distance) - </dd> - <dt class="col-sm-2"> - Vaqt: - </dt> - <dd class="col-sm-10"> - @(Model.Date.HasValue ? Model.Date.Value.ToString("yyyy-MM-dd | HH:mm") : "Date not available") - </dd> - <dt class="col-sm-2"> - Izoh: - </dt> - <dd class="col-sm-10"> - @Html.DisplayFor(model => model.Comments) - </dd> - </dl> - - <form asp-action="Delete"> - <div class="form-group"> - <a asp-action="Index" class="btn btn-outline-info"> - <i class="fa-solid fa-arrow-left-long"></i> - Orqaga - </a> - <button asp-route-itemid="@Model.Id" class="btn btn-outline-danger"> - <i class="fa-solid fa-trash"></i> - O'chirish - </button> - </div> - </form> -</div> diff --git a/CheckDrive.Web/CheckDrive.Web/Views/MechanicAcceptances/Details.cshtml b/CheckDrive.Web/CheckDrive.Web/Views/MechanicAcceptances/Details.cshtml deleted file mode 100644 index 32533851..00000000 --- a/CheckDrive.Web/CheckDrive.Web/Views/MechanicAcceptances/Details.cshtml +++ /dev/null @@ -1,95 +0,0 @@ -@using CheckDrive.ApiContracts -@model CheckDrive.ApiContracts.MechanicAcceptance.MechanicAcceptanceDto - -@{ - ViewData["Title"] = "Details"; - Layout = null; -} - -<div class="grid-container"> - <div class="row content"> - <div class="col text-center"> - Mexanik F.I.SH - </div> - <div class="col text-center"> - Haydovchi F.I.SH - </div> - </div> - <div class="row value"> - <div class="col text-center"> - @Model.MechanicName - </div> - <div class="col text-center"> - @Model.DriverName - </div> - </div> - <div class="row content"> - <div class="col text-center"> - Avtomobil - </div> - <div class="col text-center"> - Qabul qilish - </div> - <div class="col text-center"> - Qabul qilish masofasi - </div> - </div> - <div class="row value"> - <div class="col text-center"> - @Model.CarName - </div> - <div class="col text-center"> - @(Model.IsAccepted.HasValue ? (Model.IsAccepted.Value ? "Qabul qilindi" : "Qabul qilinmadi") : "N/A") - </div> - <div class="col text-center"> - @Model.Distance - </div> - </div> - <div class="row content"> - <div class="col text-center"> - Yoqilg'i qoldig'i - </div> - <div class="col text-center"> - Vaqt - </div> - <div class="col text-center"> - Holati - </div> - </div> - <div class="row value"> - <div class="col text-center"> - @Model.RemainingFuel - </div> - <div class="col text-center"> - @(Model.Date.HasValue ? Model.Date.Value.ToString("yyyy-MM-dd | HH:mm") : "Date not available") - </div> - <div class="col text-center"> - @{ - string statusUzbek = Model.Status switch - { - StatusForDto.Pending => "Kutilmoqda", - StatusForDto.Completed => "Yakunlangan", - StatusForDto.Rejected => "Rad etilgan", - StatusForDto.Unassigned => "Tayinlanmagan", - StatusForDto.RejectedByDriver => "Haydovchi tomonidan rad etilgan", - _ => "Noma'lum" - }; - } - @statusUzbek - </div> - </div> - <div class="row content"> - <div class="col text-center"> - Izoh - </div> - </div> - <div class="row comments"> - <div class="col text-center"> - @if (string.IsNullOrWhiteSpace(Model.Comments)) - { - Model.Comments = "Izoh mavjud emas"; - } - @Model.Comments - </div> - </div> -</div> \ No newline at end of file diff --git a/CheckDrive.Web/CheckDrive.Web/Views/MechanicAcceptances/Edit.cshtml b/CheckDrive.Web/CheckDrive.Web/Views/MechanicAcceptances/Edit.cshtml deleted file mode 100644 index 0ab97627..00000000 --- a/CheckDrive.Web/CheckDrive.Web/Views/MechanicAcceptances/Edit.cshtml +++ /dev/null @@ -1,61 +0,0 @@ -@model CheckDrive.ApiContracts.MechanicAcceptance.MechanicAcceptanceDto - -@{ - ViewData["Title"] = "Edit"; - bool isAcceptedNullable = Model.IsAccepted ?? false; -} - -<h4>Ma`lumotni tahrirlash</h4> -<hr /> -<div class="row"> - <div class="col-md-4"> - <form asp-action="Edit"> - <div asp-validation-summary="ModelOnly" class="text-danger"></div> - <div class="form-check form-switch mt-3"> - <input class="form-check-input" type="checkbox" @(isAcceptedNullable ? "checked" : "") onchange="document.getElementById('IsAccepted').value = this.checked.toString()" /> - <label class="form-check-label">Qabul qilish</label> - <input type="hidden" id="IsAccepted" name="IsAccepted" value="@isAcceptedNullable.ToString()" /> - </div> - <div class="form-group mt-3"> - <label asp-for="Status" class="control-label">Holati</label> - <select asp-for="Status" class="form-control" asp-items="ViewBag.Status"></select> - <span asp-validation-for="Status" class="text-danger"></span> - </div> - <div class="form-group mt-3"> - <label asp-for="Date" class="control-label">Sana</label> - <input asp-for="Date" class="form-control" /> - <span asp-validation-for="Date" class="text-danger"></span> - </div> - <div class="form-group mt-3"> - <label asp-for="Distance" class="control-label">Masofa</label> - <input asp-for="Distance" class="form-control" /> - <span asp-validation-for="Distance" class="text-danger"></span> - </div> - <div class="form-group mt-3"> - <label asp-for="DriverId" class="control-label">Haydovchi F.I.</label> - <select asp-for="DriverId" class="form-control" asp-items="ViewBag.DriverSelectList"></select> - <span asp-validation-for="DriverId" class="text-danger"></span> - </div> - <div class="form-group mt-3"> - <label asp-for="CarId" class="control-label">Moshina</label> - <select asp-for="CarId" class="form-control" asp-items="ViewBag.CarSelectList"></select> - <span asp-validation-for="CarId" class="text-danger"></span> - </div> - <div class="form-group mt-2"> - <label asp-for="Comments" class="control-label mt-2">Izoh</label> - <textarea asp-for="Comments" class="form-control" rows="4"></textarea> - </div> - <input type="hidden" asp-for="MechanicId" /> - <div class="form-group mt-3"> - <a asp-action="Details" asp-route-id="@Model?.Id" class="btn btn-outline-info"> - <i class="fa-solid fa-arrow-left-long"></i> - Orqaga - </a> - <button class="btn btn-outline-success"> - <i class="fa fa-pencil"></i> Saqlash - </button> - </div> - </form> - </div> -</div> - diff --git a/CheckDrive.Web/CheckDrive.Web/Views/MechanicAcceptances/HistoryIndexForPersonalPage.cshtml b/CheckDrive.Web/CheckDrive.Web/Views/MechanicAcceptances/HistoryIndexForPersonalPage.cshtml deleted file mode 100644 index d502d705..00000000 --- a/CheckDrive.Web/CheckDrive.Web/Views/MechanicAcceptances/HistoryIndexForPersonalPage.cshtml +++ /dev/null @@ -1,213 +0,0 @@ -@model IEnumerable<CheckDrive.ApiContracts.MechanicAcceptance.MechanicAcceptanceDto> - -@{ - ViewData["Title"] = "HistoryIndexForPersonalPage"; - Layout = "~/Views/Shared/_PersonalLayout.cshtml"; - string activeTab = "HistoryIndexForPersonalPage"; -} - -<form method="get" action="@Url.Action("PersonalIndex")"> - <div class="container mt-5"> - <div class="row justify-content-between align-items-center mb-4"> - <!-- Search --> - <div class="col-md-4"> - <div class="input-group"> - <input type="text" class="form-control rounded-left" placeholder="Haydovchini kiriting ..." name="searchString" value="@ViewBag.SearchString"> - <div class="input-group-append"> - <button type="submit" class="btn btn-primary"> - <i class="fa fa-search"></i> Qidirish - </button> - </div> - </div> - </div> - <!-- Date --> - <div class="col-md-2"> - <input type="date" name="date" class="form-control"> - </div> - </div> - - <div class="table-responsive"> - <table class="table table-bordered table-striped table-hover paper-shadow"> - <thead> - <tr> - <th scope="col" style="width: 10%">Haydovchi F.I</th> - <th scope="col" style="width: 15%">Mashina</th> - <th scope="col" style="width: 10%">Qabul qilish</th> - <th scope="col" style="width: 10%">Qabul qilish masofasi</th> - <th scope="col" style="width: 10%">Yoqilg`i qoldig`i</th> - <th scope="col" style="width: 15%">Izoh</th> - <th scope="col" style="width: 10%">Sana</th> - <th scope="col" style="width: 10%">Holati</th> - - </tr> - </thead> - <tbody> - @if (Model != null && Model.Any()) - { - foreach (var item in Model) - { - <tr> - <td class="text-center vertical-align-middle">@item.DriverName</td> - <td>@item.CarName</td> - <td> - @if ((bool)item.IsAccepted) - { - <span class="badge bg-success ">Qabul qilindi</span> - } - else - { - <span class="badge bg-danger ">Rad etildi</span> - } - </td> - <td>@item.Distance</td> - <td>@item.RemainingFuel</td> - <td>@item.Comments</td> - <td>@item.Date?.ToString("dd/MM/yyyy")</td> - <td class="text-center"> - @if (item.Status == CheckDrive.ApiContracts.StatusForDto.Pending) - { - <span class="badge bg-pending ">Kutilmoqda</span> - } - else if (item.Status == CheckDrive.ApiContracts.StatusForDto.Unassigned) - { - <span class="badge bg-unassigned ">Tayinlanmagan</span> - } - else if (item.Status == CheckDrive.ApiContracts.StatusForDto.Completed) - { - <span class="badge bg-success ">Yakunlangan</span> - } - else if (item.Status == CheckDrive.ApiContracts.StatusForDto.RejectedByDriver) - { - <span class="badge bg-danger ">Haydovchi tomonidan rad etilgan</span> - } - else if (item.Status == CheckDrive.ApiContracts.StatusForDto.Rejected) - { - <span class="badge bg-danger ">Rad etilgan</span> - } - else - { - <span class="badge bg-empty ">No`malum holat</span> - } - </td> - </tr> - } - } - else - { - <tr> - <td colspan="8" class="text-center"> - Maʼlumotlar mavjud emas - </td> - </tr> - } - </tbody> - </table> - <div class="d-flex justify-content-between align-items-center my-2"> - <nav aria-label="Page navigation"> - <ul class="pagination"> - @if (ViewBag.HasPreviousPage) - { - <li class="page-item"> - <a class="page-link" href="@Url.Action("HistoryIndexForPersonalPage", new { pageNumber = 1 })" aria-label="First"> - <span aria-hidden="true">«</span> - </a> - </li> - <li class="page-item"> - <a class="page-link" href="@Url.Action("HistoryIndexForPersonalPage", new { pageNumber = ViewBag.CurrentPage - 1 })">@(@ViewBag.CurrentPage - 1)</a> - </li> - } - @if (ViewBag.HasNextPage) - { - <li class="page-item active"> - <span class="page-link">@ViewBag.CurrentPage</span> - </li> - <li class="page-item"> - <a class="page-link" href="@Url.Action("HistoryIndexForPersonalPage", new { pageNumber = ViewBag.CurrentPage + 1 })">@(@ViewBag.CurrentPage + 1)</a> - </li> - <li class="page-item"> - <a class="page-link" href="@Url.Action("HistoryIndexForPersonalPage", new { pageNumber = ViewBag.PageCount })" aria-label="Last"> - <span aria-hidden="true">»</span> - </a> - </li> - } - </ul> - </nav> - <div class="p-2"> - <p class="h6 mb-0">@ViewBag.PageCount sahifadan @ViewBag.CurrentPage tasi ( umumiy ishchilar soni: @ViewBag.TotalCount)</p> - </div> - </div> - </div> - </div> -</form> - -<style> - .nav-tabs .nav-link.active { - background-color: #007bff; - color: white; - } - - .nav-tabs .nav-link { - border: 1px solid #dee2e6; - } - - .badge { - font-size: 0.8rem; - padding: 5px 10px; - border-radius: 5px; - } - - .bg-pending { - background-color: orange; - } - - .bg-unassigned { - background-color: slategray; - } - - .bg-success { - background-color: #28a745; - } - - .bg-danger { - background-color: #dc3545; - } - - .bg-secondary { - background-color: #6c757d; - } - - .container { - margin-top: 30px; - } - - .table-bordered { - border: 1px solid #dee2e6; - } - - .table-bordered th, - .table-bordered td { - border: 1px solid #dee2e6; - } - - .paper-shadow { - background: white; - box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); - border-radius: 10px; - } - - .pagination { - justify-content: flex-end; - } - - .shadow { - box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); - } - - .pagination .page-link { - margin-left: 5px; - } - - .pagination .page-item.shadow { - box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); - } -</style> diff --git a/CheckDrive.Web/CheckDrive.Web/Views/MechanicAcceptances/Index.cshtml b/CheckDrive.Web/CheckDrive.Web/Views/MechanicAcceptances/Index.cshtml deleted file mode 100644 index 5054b5a1..00000000 --- a/CheckDrive.Web/CheckDrive.Web/Views/MechanicAcceptances/Index.cshtml +++ /dev/null @@ -1,255 +0,0 @@ -@model IEnumerable<CheckDrive.ApiContracts.MechanicAcceptance.MechanicAcceptanceDto> - -@{ - ViewData["Title"] = "Mechanic Acceptances"; - Layout = "~/Views/Shared/_Layout.cshtml"; -} - -<form asp-controller="MechanicAcceptances" asp-action="Index"> - <div class="row mt-4"> - <div class="d-flex justify-content-between mb-4"> - <div class="col-md-4 filter-bar position-relative"> - <div class="position-relative w-100"> - <i class="fa-solid fa-magnifying-glass position-absolute top-50 start-0 translate-middle-y ms-3" style="color: dimgray;"></i> - <ejs-textbox id="search-box" - name="search" - class="search-box ps-5" - placeholder="Izlash..." - floatLabelType="Never" - value="@ViewBag.SearchString" - input="onChangeSearchAndDate"> - </ejs-textbox> - </div> - </div> - <div class="col-md-4 date-filter"> - <div class="d-flex gap-4"> - <ejs-datepicker id="date" - format="dd-MM-yyyy" - placeholder="Sanani tanlang" - floatLabelType="Never" - change="onChangeSearchAndDate"> - </ejs-datepicker> - <button class="btn btn-outline-info dropdown-toggle" type="button" id="dropdownMenuButton" data-bs-toggle="dropdown" aria-expanded="false"> - <i class="fa-solid fa-download"></i> Yuklab olish - </button> - </div> - </div> - </div> - </div> -</form> - -<div class="row"> - <div class="col-12"> - <ejs-grid - id="mechanicAcceptances-list" - dataSource="@ViewBag.MechanicAcceptances" - gridLines="Both" - allowSorting="true" - allowPaging="true" - dataBound="onDataBound"> - <e-grid-pagesettings pageSize="10"></e-grid-pagesettings> - <e-grid-columns> - <e-grid-column headerText="Mexanik" field="MechanicName" type="string" textAlign=Center headerTextAlign=Center width="200"></e-grid-column> - <e-grid-column headerText="Haydovchi" field="DriverName" type="string" textAlign=Center headerTextAlign=Center width="200"></e-grid-column> - <e-grid-column headerText="Avtomobil" field="CarName" template="#carTemplate" type="string" textAlign=Center headerTextAlign=Center></e-grid-column> - <e-grid-column headerText="Ko'rik vaqt" field="Date" type="date" format="dd-MM-yyyy | HH:mm" textAlign=Center headerTextAlign=Center></e-grid-column> - <e-grid-column headerText="Status" field="Status" template="#statusColumnTemplate" textAlign=Center headerTextAlign=Center width="100"></e-grid-column> - <e-grid-column width="100" type="text" textAlign="Center" template="#actionTemplate"></e-grid-column> - </e-grid-columns> - </ejs-grid> - </div> -</div> - -<script> - let selectedYear = new Date().getFullYear(); - let selectedMonth = new Date().getMonth() + 1; - - function valueChange(args) { - var selectedDate = args.value; - selectedYear = selectedDate.getFullYear(); - selectedMonth = selectedDate.getMonth() + 1; - - document.getElementById('date_label').textContent = 'Выбранное значение: ' + selectedDate.toDateString(); - } - - document.getElementById('dropdownMenu').addEventListener('click', function (event) { - event.stopPropagation(); - }); - - document.getElementById('downloadButton').addEventListener('click', function (e) { - e.preventDefault(); - - const url = `/MechanicAcceptances/Download?year=${selectedYear}&month=${selectedMonth}`; - - const link = document.createElement('a'); - link.href = url; - link.setAttribute('download', ''); - document.body.appendChild(link); - link.click(); - document.body.removeChild(link); - - const dropdown = bootstrap.Dropdown.getInstance(document.getElementById('dropdownMenuButton')); - dropdown.hide(); - }); - - function onDataBound() { - const headers = document.querySelectorAll('#mechanicAcceptances-list .e-headercell'); - - headers.forEach(header => { - header.setAttribute('title', header.innerText.trim()); - }); - } -</script> - - <script id="statusColumnTemplate" type="text/x-template"> - ${if(Status == 0)} - <span class="badge bg-warning">Kutilmoqda</span> - ${else if(Status == 1)} - <span class="badge bg-success">Yakunlangan</span> - ${else if(Status == 2)} - <span class="badge bg-danger">Rad etilgan</span> - ${else if(Status == 4)} - <span class="badge bg-danger">Haydovchi tomonidan rad etilgan</span> - ${/if} -</script> - -<script id="carTemplate" type="text/x-template"> - <div> - <a rel='nofollow' href="#" class="car-detail-link" data-id="${CarId}">${CarName}</a> - </div> -</script> - -<div class="modal fade" id="carDetailsModal" tabindex="-1" aria-labelledby="exampleModalLabel" aria-hidden="true"> - <div class="modal-dialog modal-lg"> - <div class="modal-content"> - <div class="modal-header d-flex justify-content-center"> - <h3 class="modal-title" id="detailsModalLabel">Mexanik (Qabul qilish) ma'lumotari</h3> - <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button> - </div> - <div class="modal-body" id="carDetailsContent"> - </div> - </div> - </div> -</div> - -<script> - document.addEventListener('DOMContentLoaded', function () { - document.addEventListener('click', function (e) { - if (e.target.classList.contains('car-detail-link')) { - e.preventDefault(); - const id = e.target.getAttribute('data-id'); - $.ajax({ - url: `/cars/details/${id}`, - type: 'GET', - success: function (data) { - $('#carDetailsContent').html(data); - $('#carDetailsModal').modal({ - backdrop: 'static', - keyboard: false - }).modal('show'); - }, - error: function () { - $('#carDetailsContent').html('<p>Error loading details</p>'); - } - }); - } - }); - - $('#detailsModal').on('hidden.bs.modal', function () { - $(this).find('#detailsContent').empty(); - }); - }); -</script> - -<script type="text/x-template" id="actionTemplate"> - <button type="button" class="shadow-sm bg-white rounded e-btn e-flat mx-2" title="Tafsilot" onclick="onDetailsClick(${Id})"> - <i class="bi bi-card-list text-info" style="font-size: 19px;"></i> - </button> -</script> - -<div class="modal fade" id="detailsModal" tabindex="-1" aria-labelledby="detailsModalLabel" aria-hidden="true"> - <div class="modal-dialog modal-lg"> - <div class="modal-content mt-4"> - <div class="modal-header d-flex justify-content-center"> - <h3 class="modal-title" id="detailsModalLabel">Mexanik (Topshirish) ma'lumotari</h3> - <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button> - </div> - <div class="modal-body" id="detailsContent"> - </div> - </div> - </div> -</div> - -<script> - function onDetailsClick(id) { - $('#detailsContent').empty(); - $.ajax({ - url: `/mechanicAcceptances/details/${id}`, - type: 'GET', - contentType: 'application/x-www-form-urlencoded; charset=UTF-8', - success: function (data) { - $('#detailsContent').html(data); - var detailsModal = new bootstrap.Modal(document.getElementById('detailsModal'), { - backdrop: 'static', - keyboard: false - }); - detailsModal.show(); - }, - error: function (error) { - alert("Ma'lumotlarni yuklashda muammo yuz berdi."); - } - }); - } - - $('#detailsModal').on('hidden.bs.modal', function () { - $(this).find('#detailsContent').empty(); - }); -</script> - -<script> - function onChangeSearchAndDate(args) { - const searchInput = document.getElementById("search-box").value.trim(); - const gridElement = document.getElementById("mechanicAcceptances-list"); - const gridInstance = gridElement?.ej2_instances?.[0]; - - if (!gridInstance) { - console.error("Grid instance not found."); - return; - } - - if (searchInput) { - gridInstance.search(searchInput); - } else { - gridInstance.searchSettings.key = ""; - } - - gridInstance.refresh(); - } -</script> - -<style> - .e-input-group input { - height: 35px !important; - } - - .search-box { - padding-left: 2rem; - } - - .position-relative .fa-magnifying-glass { - pointer-events: none; - z-index: 1; - } - - button { - height: 37px; - } - - .e-pager .e-pagerexternalmsg { - display: none; - } - - .modal-content { - width: 90%; - } -</style> diff --git a/CheckDrive.Web/CheckDrive.Web/Views/MechanicAcceptances/PersonalIndex.cshtml b/CheckDrive.Web/CheckDrive.Web/Views/MechanicAcceptances/PersonalIndex.cshtml deleted file mode 100644 index 696b4a50..00000000 --- a/CheckDrive.Web/CheckDrive.Web/Views/MechanicAcceptances/PersonalIndex.cshtml +++ /dev/null @@ -1,382 +0,0 @@ -@model IEnumerable<CheckDrive.ApiContracts.MechanicAcceptance.MechanicAcceptanceDto> -<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script> <!-- jQuery --> -<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-icons/1.10.0/font/bootstrap-icons.min.css"> - -@{ - ViewData["Title"] = "Mechanic Acceptances (Personal)"; - Layout = "~/Views/Shared/_PersonalLayout.cshtml"; - string activeTab = "MechanicAcceptances"; -} -<form method="get" action="@Url.Action("PersonalIndex")"> - <div class="container mt-5"> - <div class="row justify-content-between align-items-center mb-4"> - <!-- Search --> - <div class="col-md-4"> - <div class="input-group"> - <input type="text" class="form-control rounded-left" placeholder="Haydovchini kiriting ..." name="searchString" value="@ViewBag.SearchString"> - <div class="input-group-append"> - <button type="submit" class="btn btn-primary"> - <i class="fa fa-search"></i> Qidirish - </button> - </div> - </div> - </div> - <div class="col-md-8 d-flex justify-content-end align-items-center gap-2"> - <button class="btn btn-outline-info dropdown-toggle" type="button" id="dropdownMenuButton" data-bs-toggle="dropdown" aria-expanded="false"> - <i class="fa-solid fa-download"></i> Yuklab olish - </button> - <div class="dropdown-menu p-3" id="dropdownMenu" aria-labelledby="dropdownMenuButton" data-bs-auto-close="outside"> - <ejs-calendar id="calendar" change="valueChange" Start="Year" Depth="Year"></ejs-calendar> - <a class="dropdown-item mt-2 btn btn-info" href="#" id="downloadButton">Yuklash</a> - </div> - <button id="openCreteMechanicAcceptancesModal" - class="btn btn-success" - type="button"> - <i class="fa fa-plus"></i> Yaratish - </button> - </div> - </div> - - <div class="table-responsive"> - <table class="table table-bordered table-striped table-hover paper-shadow"> - <thead> - <tr> - <th scope="col" style="width: 10%">Haydovchi F.I</th> - <th scope="col" style="width: 15%">Mashina</th> - <th scope="col" style="width: 10%">Sana</th> - <th scope="col" style="width: 10%">Holati</th> - - </tr> - </thead> - <tbody> - @if (Model != null && Model.Any()) - { - foreach (var item in Model) - { - <tr> - <td class="text-center vertical-align-middle"> - @if (item.Status == CheckDrive.ApiContracts.StatusForDto.Unassigned) - { - <a href="/MechanicAcceptances/CreateByLink?driverId=@item.DriverId&carId=@item.CarId&carName=@item.CarName&driverName=@item.DriverName&remainingFuel=@item.RemainingFuel">@item.DriverName</a> - - } - else - { - @item.DriverName - } - </td> - <td>@item.CarName</td> - <td>@item.Date?.ToString("dd/MM/yyyy")</td> - <td class="text-center"> - @if (item.Status == CheckDrive.ApiContracts.StatusForDto.Pending) - { - <span class="badge bg-pending ">Kutilmoqda</span> - } - else if (item.Status == CheckDrive.ApiContracts.StatusForDto.Unassigned) - { - <span class="badge bg-unassigned ">Tayinlanmagan</span> - } - else if (item.Status == CheckDrive.ApiContracts.StatusForDto.Completed) - { - <span class="badge bg-success ">Yakunlangan</span> - } - else if (item.Status == CheckDrive.ApiContracts.StatusForDto.RejectedByDriver) - { - <span class="badge bg-danger ">Haydovchi tomonidan rad etilgan</span> - } - else if (item.Status == CheckDrive.ApiContracts.StatusForDto.Rejected) - { - <span class="badge bg-danger ">Rad etilgan</span> - } - else - { - <span class="badge bg-empty ">No`malum holat</span> - } - </td> - </tr> - } - } - else - { - <tr> - <td colspan="9" class="text-center"> - Maʼlumotlar mavjud emas - </td> - </tr> - } - </tbody> - </table> - <div class="d-flex justify-content-between align-items-center my-2"> - <nav aria-label="Page navigation"> - <ul class="pagination"> - @if (ViewBag.HasPreviousPage) - { - <li class="page-item"> - <a class="page-link" href="@Url.Action("PersonalIndex", new { pageNumber = 1 })" aria-label="First"> - <span aria-hidden="true">«</span> - </a> - </li> - <li class="page-item"> - <a class="page-link" href="@Url.Action("PersonalIndex", new { pageNumber = ViewBag.CurrentPage - 1 })">@(@ViewBag.CurrentPage - 1)</a> - </li> - } - @if (ViewBag.HasNextPage) - { - <li class="page-item active"> - <span class="page-link">@ViewBag.CurrentPage</span> - </li> - <li class="page-item"> - <a class="page-link" href="@Url.Action("PersonalIndex", new { pageNumber = ViewBag.CurrentPage + 1 })">@(@ViewBag.CurrentPage + 1)</a> - </li> - <li class="page-item"> - <a class="page-link" href="@Url.Action("PersonalIndex", new { pageNumber = ViewBag.PageCount })" aria-label="Last"> - <span aria-hidden="true">»</span> - </a> - </li> - } - </ul> - </nav> - <div class="p-2"> - <p class="h6 mb-0">@ViewBag.PageCount sahifadan @ViewBag.CurrentPage tasi ( umumiy ishchilar soni: @ViewBag.TotalCount)</p> - </div> - </div> - </div> - </div> -</form> -<!-- Modal oyna --> -<div class="modal fade" id="createMechanicAcceptancesReviewModal" tabindex="-1" aria-labelledby="createReviewModalLabel" aria-hidden="true"> - <div class="modal-dialog modal-lg "> - <div class="modal-content"> - <div class="modal-header d-flex justify-content-center"> - <h5 id="createMechanicAcceptancesReviewModalLabel">Ro'yxatga olish</h5> - <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"> - <span aria-hidden="true"></span> - </button> - </div> - <div class="modal-body" id="modalContent"> - </div> - </div> - </div> -</div> - -@section Scripts { - <script type="text/javascript"> - $(document).ready(function () { - $('#openCreteMechanicAcceptancesModal').on('click', function () { - $('#modalContent').empty(); - $.ajax({ - url: '/mechanicacceptances/createbybutton', - type: 'GET', - contentType: 'application/x-www-form-urlencoded; charset=UTF-8', - headers: { - 'RequestVerificationToken': $('input[name="__RequestVerificationToken"]').val() - }, - success: function (data) { - $('#modalContent').html(data); - $('#createMechanicAcceptancesReviewModal').modal('show'); - var checkbox = document.getElementById('flexSwitchCheckDefault'); - var distanceGroup = document.getElementById('distanceGroup'); - var driverSelect = document.getElementById('driverSelect'); - var carSelect = document.getElementById('carSelect'); - var distanceInput = document.getElementById('distanceInput'); - var submitButton = document.getElementById('submitButton'); // Correct button ID - var carIdInput = document.getElementById('carIdInput'); - var remainingFuelInput = document.getElementById('remainingFuelInput'); - var mileage = 0; - - function toggleDistanceInput() { - if (checkbox.checked) { - distanceGroup.style.display = "block"; - } else { - distanceGroup.style.display = "none"; - } - } - - checkbox.addEventListener('change', toggleDistanceInput); - toggleDistanceInput(); // Initial check - - driverSelect.addEventListener('change', function () { - var selectedOption = driverSelect.options[driverSelect.selectedIndex]; - var carId = selectedOption.getAttribute('data-carid'); - var carName = selectedOption.getAttribute('data-carname'); - mileage = parseInt(selectedOption.getAttribute('data-mileage')) || 0; - - if (carId) { - fetch(`/MechanicAcceptances/GetCarDetails?carId=${carId}`) - .then(response => response.json()) - .then(data => { - carIdInput.value = carId; - carSelect.innerHTML = `<option value="${carId}">${carName}</option>`; - distanceInput.value = mileage; - remainingFuelInput.value = data.remainingFuel; - validateDistance(); - }) - .catch(error => console.error('Error fetching car details:', error)); - } else { - carSelect.innerHTML = '<option value="">Avtomobil tanlang</option>'; - distanceInput.value = ''; - remainingFuelInput.value = ''; - } - }); - - distanceInput.addEventListener('input', function () { - validateDistance(); - }); - - function validateDistance() { - var distance = Number(distanceInput.value); - if (distance < mileage) { - distanceInput.classList.add('is-invalid'); - showValidationMessage(`Qabul qilish masofasi avtomobilning oxirgi kiritilgan masofasidan ${mileage} km kam bo'lishi mumkin emas!`); - submitButton.disabled = true; // Disable the correct button - } else { - distanceInput.classList.remove('is-invalid'); - clearValidationMessage(); - submitButton.disabled = false; // Enable the correct button - } - } - - function showValidationMessage(message) { - var errorSpan = document.querySelector('.distance-validation-message'); - if (!errorSpan) { - errorSpan = document.createElement('span'); - errorSpan.className = 'distance-validation-message text-danger'; - distanceInput.parentNode.appendChild(errorSpan); - } - errorSpan.textContent = message; - } - - function clearValidationMessage() { - var errorSpan = document.querySelector('.distance-validation-message'); - if (errorSpan) { - errorSpan.textContent = ''; - } - } - }, - error: function () { - alert("Ro'yhatga olish formani yuklashda xatolik yuz berdi."); - } - }); - }); - }); - $('#createMechanicAcceptancesReviewModal').on('hidden.bs.modal', function () { - $(this).find('#modalContent').empty(); // Modal yopilganda ichki kontentni tozalash - }); - </script> -} - -<style> - .modal-content { - width: 550px; - } - .nav-tabs .nav-link.active { - background-color: #007bff; - color: white; - } - - .nav-tabs .nav-link { - border: 1px solid #dee2e6; - } - - .badge { - font-size: 0.8rem; - padding: 5px 10px; - border-radius: 5px; - } - - .bg-pending { - background-color: orange; - } - - .bg-unassigned { - background-color: slategray; - } - - .bg-success { - background-color: #28a745; - } - - .bg-danger { - background-color: #dc3545; - } - - .bg-secondary { - background-color: #6c757d; - } - - .container { - margin-top: 30px; - } - - .table-bordered { - border: 1px solid #dee2e6; - } - - .table-bordered th, - .table-bordered td { - border: 1px solid #dee2e6; - } - - .paper-shadow { - background: white; - box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); - border-radius: 10px; - } - - .pagination { - justify-content: flex-end; - } - - .shadow { - box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); - } - - .pagination .page-link { - margin-left: 5px; - } - - .pagination .page-item.shadow { - box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); - } -</style> - -<script> - // Default selected year and month - let selectedYear = new Date().getFullYear(); // Current year - let selectedMonth = new Date().getMonth() + 1; // Current month (months are zero-based) - - // Function to handle the change event in the calendar - function valueChange(args) { - var selectedDate = args.value; - selectedYear = selectedDate.getFullYear(); - selectedMonth = selectedDate.getMonth() + 1; // Months are zero-based - - // Optionally, update a label to display the selected date (if you have one) - document.getElementById('date_label').textContent = 'Выбранное значение: ' + selectedDate.toDateString(); - } - - // Prevent the dropdown from closing when clicking inside - document.getElementById('dropdownMenu').addEventListener('click', function (event) { - event.stopPropagation(); // Stops the dropdown from closing when interacting with its contents - }); - - // Handle the download button click - document.getElementById('downloadButton').addEventListener('click', function (e) { - e.preventDefault(); // Prevent the default action of the link - - // Construct the download URL using the selected year and month - const url = `/MechanicAcceptances/Download?year=${selectedYear}&month=${selectedMonth}`; - - // Create a temporary link to trigger the download - const link = document.createElement('a'); - link.href = url; - link.setAttribute('download', ''); // Add download attribute to force download - document.body.appendChild(link); - link.click(); - document.body.removeChild(link); // Clean up - - // Manually close the dropdown after downloading - const dropdown = bootstrap.Dropdown.getInstance(document.getElementById('dropdownMenuButton')); - dropdown.hide(); - }); -</script> diff --git a/CheckDrive.Web/CheckDrive.Web/Views/MechanicHandovers/Create.cshtml b/CheckDrive.Web/CheckDrive.Web/Views/MechanicHandovers/Create.cshtml deleted file mode 100644 index 3789a6fa..00000000 --- a/CheckDrive.Web/CheckDrive.Web/Views/MechanicHandovers/Create.cshtml +++ /dev/null @@ -1,178 +0,0 @@ -@model CheckDrive.ApiContracts.MechanicHandover.MechanicHandoverForCreateDto - -@{ - ViewData["Title"] = "Create"; - Layout = null; - bool noDriversAvailable = ViewBag.Drivers == null || !((IEnumerable<SelectListItem>)ViewBag.Drivers).Any(); - bool noCarsAvailable = ViewBag.Cars == null || !((IEnumerable<SelectListItem>)ViewBag.Cars).Any(); -} -<form id="mechanicHandoverForm" asp-action="Create" method="post"> - <div class="row mt-custom" style="width:580px"> - <div class="col-md-4 offset-md-1 mt-1" style="width:580px"> - @if (noDriversAvailable) - { - <div class="alert alert-warning form-group w-50 mt-2"> - <strong>Diqqat!</strong> Hozirda mavjud haydovchilar yo'q. Iltimos, keyinroq qayta urinib ko'ring. - </div> - } - - <fieldset @(noDriversAvailable ? "disabled" : "")> - <div asp-validation-summary="ModelOnly" class="text-danger"></div> - <div class="form-group w-50 mt-3"> - <label asp-for="DriverId" class="control-label mt-2">Haydovchi</label> - @if (ViewBag.SelectedDriverId != null && ViewBag.SelectedDriverId != 0) - { - <input type="text" class="form-control" value="@ViewBag.SelectedDriverName" disabled /> - <input type="hidden" asp-for="DriverId" value="@ViewBag.SelectedDriverId" /> - } - else - { - @if (noDriversAvailable) - { - <select id="driverIdDropdown" class="form-control border border-dark" disabled> - <option selected>Haydovchilar mavjud emas</option> - </select> - } - else - { - <select asp-for="DriverId" id="driverIdDropdown" class="form-control form-select border border-dark" asp-items="@ViewBag.Drivers"> - <option value="" selected>Haydovchini tanlang</option> - </select> - } - } - </div> - <div class="form-group w-50 mt-3"> - <input type="hidden" asp-for="MechanicId" class="form-control border border-dark d-none" /> - </div> - <div class="form-group w-50 mt-3"> - <label asp-for="CarId" class="control-label mt-2">Mashina</label> - @if (noCarsAvailable) - { - <select id="carIdDropdown" class="form-control border border-dark" disabled> - <option selected>Mashinalar mavjud emas</option> - </select> - } - else - { - <select asp-for="CarId" id="carIdDropdown" class="form-control border border-dark form-select" asp-items="@ViewBag.Cars"> - <option value="" selected>Avtomobil tanlang</option> - </select> - } - </div> - - <div class="form-check form-switch mt-3"> - <input asp-for="IsHanded" class="form-check-input" type="checkbox" role="switch" id="flexSwitchCheckDefault"> - <label asp-for="IsHanded" class="form-check-label" for="flexSwitchCheckDefault">Topshirish</label> - </div> - - <!-- Оборачиваем поле Distance в контейнер --> - <div id="distanceInputContainer" class="form-group w-50 mt-3" style="display: none;"> - <label asp-for="Distance" class="control-label mt-2">Boshlang'ich masofasi</label> - <input asp-for="Distance" class="form-control" type="number" min="0" step="1" /> - <span asp-validation-for="Distance" class="text-danger"></span> - </div> - - <div class="form-group w-50 mt-3"> - <label asp-for="RemainingFuel" class="control-label mt-2">Yoqilg`i qoldig`i</label> - <input asp-for="RemainingFuel" class="form-control" type="number" min="0" step="1" disabled /> - <span asp-validation-for="RemainingFuel" class="text-danger"></span> - </div> - <div class="form-group w-50 mt-3"> - <label asp-for="Comments" class="control-label mt-2">Izoh</label> - <textarea asp-for="Comments" class="form-control" rows="4"></textarea> - </div> - </fieldset> - - <div class="form-group justify-content-center d-flex w-50 mt-3"> - <button style="width:150px" class="btn btn-success" type="submit" id="submitButton" @(noDriversAvailable ? "disabled" : "")> - Saqlash - </button> - </div> - </div> - </div> -</form> - - - @section Scripts { - <script type="text/javascript"> - document.addEventListener('DOMContentLoaded', function () { - var form = document.getElementById('mechanicHandoverForm'); - var checkbox = document.getElementById('flexSwitchCheckDefault'); - var checkboxLabel = document.querySelector('label[for="flexSwitchCheckDefault"]'); - var carDropdown = document.getElementById('carIdDropdown'); - var distanceInputContainer = document.getElementById('distanceInputContainer'); - var distanceInput = document.querySelector('input[name="Distance"]'); - var fuelInput = document.querySelector('input[name="RemainingFuel"]'); - var mileage = 0; - - function toggleCheckboxHighlight() { - if (checkbox.checked) { - checkbox.classList.remove('border-danger'); - checkboxLabel.classList.remove('text-danger'); - distanceInputContainer.style.display = 'block'; - } else { - checkbox.classList.add('border-danger'); - checkboxLabel.classList.add('text-danger'); - distanceInputContainer.style.display = 'none'; - } - } - - toggleCheckboxHighlight(); - checkbox.addEventListener('change', toggleCheckboxHighlight); - - carDropdown.addEventListener('change', function () { - var selectedCarId = carDropdown.value; - if (selectedCarId) { - fetch(`/MechanicHandovers/GetCarDetails?carId=${selectedCarId}`) - .then(response => response.json()) - .then(data => { - if (data && data.mileage !== undefined) { - mileage = data.mileage; - distanceInput.value = mileage; - distanceInput.setAttribute('min', mileage); - } - if (data && data.remainingFuel !== undefined) { - fuelInput.value = data.remainingFuel; - } - }) - .catch(error => console.error('Error fetching car details:', error)); - } - }); - - form.addEventListener('submit', function (event) { - var distanceValue = Number(distanceInput.value); - var isGiven = checkbox.checked; - - if (distanceValue < mileage) { - event.preventDefault(); - alert("Masofa mashinaning mavjud yurgan masofasidan kam bo'lishi mumkin emas!"); - } else if (distanceValue === 0 && isGiven) { - event.preventDefault(); - alert("Boshlang'ich masofani kiritishingiz shart!"); - } - }); - }); - </script> -} - -<style> - .border-danger { - border-color: red !important; - background-color: #f8d7da !important; - } - - .text-danger { - color: red !important; - } - - fieldset[disabled] .form-control, - fieldset[disabled] .btn { - background-color: #e9ecef; - cursor: not-allowed; - } - - fieldset[disabled] .form-control:disabled, - fieldset[disabled] .btn:disabled { - opacity: 1; - } -</style> diff --git a/CheckDrive.Web/CheckDrive.Web/Views/MechanicHandovers/Delete.cshtml b/CheckDrive.Web/CheckDrive.Web/Views/MechanicHandovers/Delete.cshtml deleted file mode 100644 index d0fd4341..00000000 --- a/CheckDrive.Web/CheckDrive.Web/Views/MechanicHandovers/Delete.cshtml +++ /dev/null @@ -1,79 +0,0 @@ -@model CheckDrive.ApiContracts.MechanicHandover.MechanicHandoverDto - -@{ - ViewData["Title"] = "Delete"; -} - -<h1 class="align-items-baseline" style="margin-top: 100px">O'chirish</h1> -<hr /> - -<h3 style="color:grey;"> - Haqiqatan ham buni oʻchirib tashlamoqchimisiz? - O'chirsangiz bu ma`lumotni qayta tiklay olmaysiz!!! -</h3> -<div> - <hr /> - <dl class="row"> - <dt class="col-sm-2"> - Mexanik F.I.SH: - </dt> - <dd class="col-sm-10"> - @Html.DisplayFor(model => model.MechanicName) - </dd> - <dt class="col-sm-2"> - Haydovchi F.I.SH: - </dt> - <dd class="col-sm-10"> - @Html.DisplayFor(model => model.DriverName) - </dd> - <dt class="col-sm-2"> - Avtomobil: - </dt> - <dd class="col-sm-10"> - @Html.DisplayFor(model => model.CarName) - </dd> - <dt class="col-sm-2"> - Topshirish: - </dt> - <dd class="col-sm-10"> - @(Model.IsHanded.HasValue ? (Model.IsHanded.Value ? "Topshirildi" : "Topshirilmadi") : "N/A") - </dd> - <dt class="col-sm-2"> - Topshirish masofasi: - </dt> - <dd class="col-sm-10"> - @Html.DisplayFor(model => model.Distance) - </dd> - <dt class="col-sm-2"> - Yoqilg`i qoldig`i: - </dt> - <dd class="col-sm-10"> - @Html.DisplayFor(model => model.RemainingFuel) - </dd> - <dt class="col-sm-2"> - Vaqt: - </dt> - <dd class="col-sm-10"> - @(Model.Date.ToString("yyyy-MM-dd | HH:mm")) - </dd> - <dt class="col-sm-2"> - Izoh: - </dt> - <dd class="col-sm-10"> - @Html.DisplayFor(model => model.Comments) - </dd> - </dl> - - <form asp-action="Delete"> - <div class="form-group"> - <a asp-action="Index" class="btn btn-outline-info"> - <i class="fa-solid fa-arrow-left-long"></i> - Orqaga - </a> - <button asp-route-itemid="@Model.Id" class="btn btn-outline-danger"> - <i class="fa-solid fa-trash"></i> - O'chirish - </button> - </div> - </form> -</div> diff --git a/CheckDrive.Web/CheckDrive.Web/Views/MechanicHandovers/Details.cshtml b/CheckDrive.Web/CheckDrive.Web/Views/MechanicHandovers/Details.cshtml deleted file mode 100644 index 47eed8f2..00000000 --- a/CheckDrive.Web/CheckDrive.Web/Views/MechanicHandovers/Details.cshtml +++ /dev/null @@ -1,95 +0,0 @@ -@using CheckDrive.ApiContracts -@model CheckDrive.ApiContracts.MechanicHandover.MechanicHandoverDto - -@{ - ViewData["Title"] = "Details"; - Layout = null; -} - -<div class="grid-container mt-3"> - <div class="row content"> - <div class="col text-center"> - Mexanik F.I.SH - </div> - <div class="col text-center"> - Haydovchi F.I.SH - </div> - </div> - <div class="row value"> - <div class="col text-center"> - @Model.MechanicName - </div> - <div class="col text-center"> - @Model.DriverName - </div> - </div> - <div class="row content"> - <div class="col text-center"> - Avtomobil - </div> - <div class="col text-center"> - Topshirish - </div> - <div class="col text-center"> - Topshirish masofasi - </div> - </div> - <div class="row value"> - <div class="col text-center"> - @Model.CarName - </div> - <div class="col text-center"> - @(Model.IsHanded.HasValue ? (Model.IsHanded.Value ? "Topshirildi" : "Topshirilmadi") : "N/A") - </div> - <div class="col text-center"> - @Model.Distance - </div> - </div> - <div class="row content"> - <div class="col text-center"> - Yoqilg'i qoldig'i - </div> - <div class="col text-center"> - Sana va vaqt - </div> - <div class="col text-center"> - Holati - </div> - </div> - <div class="row value"> - <div class="col text-center"> - @Model.RemainingFuel - </div> - <div class="col text-center"> - @(Model.Date.ToString("yyyy-MM-dd | HH:mm")) - </div> - <div class="col text-center"> - @{ - string status = Model.Status switch - { - StatusForDto.Pending => "Kutilmoqda", - StatusForDto.Completed => "Yakunlangan", - StatusForDto.Rejected => "Rad etilgan", - StatusForDto.Unassigned => "Tayinlanmagan", - StatusForDto.RejectedByDriver => "Haydovchi tomonidan rad etilgan", - _ => "Noma'lum" - }; - } - @status - </div> - </div> - <div class="row content"> - <div class="col text-center"> - Izoh - </div> - </div> - <div class="row comments"> - <div class="col text-center"> - @if (string.IsNullOrWhiteSpace(Model.Comments)) - { - Model.Comments = "Izoh mavjud emas"; - } - @Model.Comments - </div> - </div> -</div> diff --git a/CheckDrive.Web/CheckDrive.Web/Views/MechanicHandovers/Edit.cshtml b/CheckDrive.Web/CheckDrive.Web/Views/MechanicHandovers/Edit.cshtml deleted file mode 100644 index f6c817c3..00000000 --- a/CheckDrive.Web/CheckDrive.Web/Views/MechanicHandovers/Edit.cshtml +++ /dev/null @@ -1,60 +0,0 @@ -@model CheckDrive.ApiContracts.MechanicHandover.MechanicHandoverDto - -@{ - ViewData["Title"] = "Edit"; - bool isHandedNullable = Model.IsHanded ?? false; -} - -<h4>Ma`lumotni tahrirlash</h4> -<hr /> -<div class="row"> - <div class="col-md-4"> - <form asp-action="Edit"> - <div asp-validation-summary="ModelOnly" class="text-danger"></div> - <div class="form-check form-switch mt-3"> - <input class="form-check-input" type="checkbox" @(isHandedNullable ? "checked" : "") onchange="document.getElementById('IsHanded').value = this.checked.toString()" /> - <label class="form-check-label">Berildimi?</label> - <input type="hidden" id="IsHanded" name="IsHanded" value="@isHandedNullable.ToString()" /> - </div> - <div class="form-group mt-3"> - <label asp-for="DriverId" class="control-label">Haydovchi F.I.</label> - <select asp-for="DriverId" class="form-control" asp-items="ViewBag.DriverSelectList"></select> - <span asp-validation-for="DriverId" class="text-danger"></span> - </div> - <div class="form-group mt-3"> - <label asp-for="CarId" class="control-label">Moshina</label> - <select asp-for="CarId" class="form-control" asp-items="ViewBag.CarSelectList"></select> - <span asp-validation-for="CarId" class="text-danger"></span> - </div> - <div class="form-group mt-3"> - <label asp-for="Status" class="control-label">Holati</label> - <select asp-for="Status" class="form-control" asp-items="ViewBag.Status"></select> - <span asp-validation-for="Status" class="text-danger"></span> - </div> - <div class="form-group"> - <label asp-for="Distance" class="control-label">Masofa</label> - <input asp-for="Distance" class="form-control" /> - <span asp-validation-for="Distance" class="text-danger"></span> - </div> - <div class="form-group mt-3"> - <label asp-for="Date" class="control-label">Sana</label> - <input asp-for="Date" class="form-control" /> - <span asp-validation-for="Date" class="text-danger"></span> - </div> - <div class="form-group mt-2"> - <label asp-for="Comments" class="control-label mt-2">Izoh</label> - <textarea asp-for="Comments" class="form-control" rows="4"></textarea> - </div> - <input type="hidden" asp-for="MechanicId" /> - <div class="form-group mt-3"> - <a asp-action="Details" asp-route-id="@Model?.Id" class="btn btn-outline-info"> - <i class="fa-solid fa-arrow-left-long"></i> - Orqaga - </a> - <button class="btn btn-outline-success"> - <i class="fa fa-pencil"></i> Saqlash - </button> - </div> - </form> - </div> -</div> diff --git a/CheckDrive.Web/CheckDrive.Web/Views/MechanicHandovers/HistoryIndexForPersonalPage.cshtml b/CheckDrive.Web/CheckDrive.Web/Views/MechanicHandovers/HistoryIndexForPersonalPage.cshtml deleted file mode 100644 index e66f9bf3..00000000 --- a/CheckDrive.Web/CheckDrive.Web/Views/MechanicHandovers/HistoryIndexForPersonalPage.cshtml +++ /dev/null @@ -1,224 +0,0 @@ -@model IEnumerable<CheckDrive.ApiContracts.MechanicHandover.MechanicHandoverDto> - -@{ - ViewData["Title"] = "HistoryIndexForPersonalPage"; - Layout = "~/Views/Shared/_PersonalLayout.cshtml"; -} - -<form method="get" action="@Url.Action("HistoryIndexForPersonalPage")"> - <div class="container mt-5"> - <div class="row justify-content-between align-items-center mb-4"> - <!-- Search --> - <div class="col-md-4"> - <div class="input-group"> - <input type="text" class="form-control rounded-left" placeholder="Haydovchini kiriting ..." name="searchString" value="@ViewBag.SearchString"> - <div class="input-group-append"> - <button type="submit" class="btn btn-primary"> - <i class="fa fa-search"></i> Qidirish - </button> - </div> - </div> - </div> - <!-- Date --> - <div class="col-md-2"> - <input type="date" name="date" class="form-control"> - </div> - </div> - - <div class="table-responsive"> - <table class="table table-bordered table-striped table-hover paper-shadow"> - <thead> - <tr> - <th scope="col" style="width: 13%">Haydovchi F.I</th> - <th scope="col" style="width: 13%">Moshina</th> - <th scope="col" style="width: 10%">Topshirish</th> - <th scope="col" style="width: 20%">Boshlang'ich masofa</th> - <th scope="col" style="width: 20%">Yoqilg`i qoldig`i</th> - <th scope="col" style="width: 38%">Izoh</th> - <th scope="col" style="width: 15%">Sana</th> - <th scope="col" style="width: 15%">Holati</th> - </tr> - </thead> - <tbody> - @if (Model != null && Model.Any()) - { - foreach (var item in Model) - { - <tr> - <td class="text-center vertical-align-middle"> - @if (!string.IsNullOrEmpty(item.MechanicName)) - { - @item.DriverName - } - else - { - <a href="/MechanicHandovers/Create?driverId=@item.DriverId">@item.DriverName</a> - } - </td> - <td>@item.CarName</td> - <td> - @if (!string.IsNullOrEmpty(item.MechanicName)) - { - @if ((bool)item.IsHanded) - { - <span class="badge bg-success ">Topshirildi</span> - } - else - { - <span class="badge bg-danger ">Topshirilmadi</span> - } - } - </td> - <td>@item.Distance</td> - <td>@item.RemainingFuel</td> - <td>@item.Comments</td> - <td>@item.Date</td> - <td class="text-center"> - @if (item.Status == CheckDrive.ApiContracts.StatusForDto.Pending) - { - <span class="badge bg-pending ">Kutilmoqda</span> - } - else if (item.Status == CheckDrive.ApiContracts.StatusForDto.Unassigned) - { - <span class="badge bg-unassigned ">Tayinlanmagan</span> - } - else if (item.Status == CheckDrive.ApiContracts.StatusForDto.Completed) - { - <span class="badge bg-success ">Yakunlangan</span> - } - else if (item.Status == CheckDrive.ApiContracts.StatusForDto.RejectedByDriver) - { - <span class="badge bg-danger ">Haydovchi tomonidan rad etilgan</span> - } - else if (item.Status == CheckDrive.ApiContracts.StatusForDto.Rejected) - { - <span class="badge bg-danger ">Rad etilgan</span> - } - else - { - <span class="badge bg-empty ">No`malum holat</span> - } - </td> - </tr> - } - } - else - { - <tr> - <td colspan="6" class="text-center"> - Maʼlumotlar mavjud emas - </td> - </tr> - } - </tbody> - </table> - <div class="d-flex justify-content-between align-items-center my-2"> - <nav aria-label="Page navigation"> - <ul class="pagination"> - @if (ViewBag.HasPreviousPage) - { - <li class="page-item"> - <a class="page-link" href="@Url.Action("HistoryIndexForPersonalPage", new { pageNumber = 1 })" aria-label="First"> - <span aria-hidden="true">«</span> - </a> - </li> - <li class="page-item"> - <a class="page-link" href="@Url.Action("HistoryIndexForPersonalPage", new { pageNumber = ViewBag.CurrentPage - 1 })">@(@ViewBag.CurrentPage - 1)</a> - </li> - } - @if (ViewBag.HasNextPage) - { - <li class="page-item active"> - <span class="page-link">@ViewBag.CurrentPage</span> - </li> - <li class="page-item"> - <a class="page-link" href="@Url.Action("HistoryIndexForPersonalPage", new { pageNumber = ViewBag.CurrentPage + 1 })">@(@ViewBag.CurrentPage + 1)</a> - </li> - <li class="page-item"> - <a class="page-link" href="@Url.Action("HistoryIndexForPersonalPage", new { pageNumber = ViewBag.PageCount })" aria-label="Last"> - <span aria-hidden="true">»</span> - </a> - </li> - } - </ul> - </nav> - <div class="p-2"> - <p class="h6 mb-0">@ViewBag.PageCount sahifadan @ViewBag.CurrentPage tasi ( umumiy ishchilar soni: @ViewBag.TotalCount)</p> - </div> - </div> - </div> - </div> -</form> - -<style> - .nav-tabs .nav-link.active { - background-color: #007bff; - color: white; - } - - .nav-tabs .nav-link { - border: 1px solid #dee2e6; - } - - .badge { - font-size: 0.8rem; - padding: 5px 10px; - border-radius: 5px; - } - - .bg-pending { - background-color: orange; - } - - .bg-unassigned { - background-color: slategray; - } - - .bg-success { - background-color: #28a745; - } - - .bg-danger { - background-color: #dc3545; - } - - .bg-secondary { - background-color: #6c757d; - } - - .container { - margin-top: 30px; - } - - .table-bordered { - border: 1px solid #dee2e6; - } - - .table-bordered th, - .table-bordered td { - border: 1px solid #dee2e6; - } - - .paper-shadow { - background: white; - box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); - border-radius: 10px; - } - - .pagination { - justify-content: flex-end; - } - - .shadow { - box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); - } - - .pagination .page-link { - margin-left: 5px; - } - - .pagination .page-item.shadow { - box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); - } - -</style> \ No newline at end of file diff --git a/CheckDrive.Web/CheckDrive.Web/Views/MechanicHandovers/Index.cshtml b/CheckDrive.Web/CheckDrive.Web/Views/MechanicHandovers/Index.cshtml deleted file mode 100644 index c9b4a2b1..00000000 --- a/CheckDrive.Web/CheckDrive.Web/Views/MechanicHandovers/Index.cshtml +++ /dev/null @@ -1,255 +0,0 @@ -@model IEnumerable<CheckDrive.ApiContracts.MechanicHandover.MechanicHandoverDto> - -@{ - ViewData["Title"] = "Index"; - Layout = "~/Views/Shared/_Layout.cshtml"; -} - -<form asp-controller="MechanicHandovers" asp-action="Index"> - <div class="row mt-4"> - <div class="d-flex justify-content-between mb-4"> - <div class="col-md-4 filter-bar position-relative"> - <div class="position-relative w-100"> - <i class="fa-solid fa-magnifying-glass position-absolute top-50 start-0 translate-middle-y ms-3" style="color: dimgray;"></i> - <ejs-textbox id="search-box" - name="search" - class="search-box ps-5" - placeholder="Izlash..." - floatLabelType="Never" - value="@ViewBag.SearchString" - input="onChangeSearchAndDate"> - </ejs-textbox> - </div> - </div> - <div class="col-md-4 date-filter"> - <div class="d-flex gap-4"> - <ejs-datepicker id="date" - format="dd-MM-yyyy" - placeholder="Sanani tanlang" - floatLabelType="Never" - change="onChangeSearchAndDate"> - </ejs-datepicker> - <button class="btn btn-outline-info dropdown-toggle" type="button" id="dropdownMenuButton" data-bs-toggle="dropdown" aria-expanded="false"> - <i class="fa-solid fa-download"></i> Yuklab olish - </button> - </div> - </div> - </div> - </div> -</form> - -<div class="row"> - <div class="col-12"> - <ejs-grid - id="mechanicHandovers-list" - dataSource="@ViewBag.MechanicHandovers" - gridLines="Both" - allowSorting="true" - allowPaging="true" - dataBound="onDataBound"> - <e-grid-pagesettings pageSize="10"></e-grid-pagesettings> - <e-grid-columns> - <e-grid-column headerText="Mexanik" field="MechanicName" type="string" textAlign=Center headerTextAlign=Center width="200"></e-grid-column> - <e-grid-column headerText="Haydovchi" field="DriverName" type="string" textAlign=Center headerTextAlign=Center width="200"></e-grid-column> - <e-grid-column headerText="Avtomobil" field="CarName" template="#carTemplate" type="string" textAlign=Center headerTextAlign=Center></e-grid-column> - <e-grid-column headerText="Ko'rik vaqti" field="Date" type="date" format="dd-MM-yyyy | HH:mm" textAlign=Center headerTextAlign=Center></e-grid-column> - <e-grid-column headerText="Status" field="Status" template="#statusColumnTemplate" textAlign=Center headerTextAlign=Center width="100"></e-grid-column> - <e-grid-column width="100" type="text" textAlign="Center" template="#actionTemplate"></e-grid-column> - </e-grid-columns> - </ejs-grid> - </div> -</div> - -<script> - let selectedYear = new Date().getFullYear(); - let selectedMonth = new Date().getMonth() + 1; - - function valueChange(args) { - var selectedDate = args.value; - selectedYear = selectedDate.getFullYear(); - selectedMonth = selectedDate.getMonth() + 1; - - document.getElementById('date_label').textContent = 'Выбранное значение: ' + selectedDate.toDateString(); - } - - document.getElementById('dropdownMenu').addEventListener('click', function (event) { - event.stopPropagation(); - }); - - document.getElementById('downloadButton').addEventListener('click', function (e) { - e.preventDefault(); - - const url = `/MechanicHandovers/Download?year=${selectedYear}&month=${selectedMonth}`; - - const link = document.createElement('a'); - link.href = url; - link.setAttribute('download', ''); - document.body.appendChild(link); - link.click(); - document.body.removeChild(link); - - const dropdown = bootstrap.Dropdown.getInstance(document.getElementById('dropdownMenuButton')); - dropdown.hide(); - }); - - function onDataBound() { - const headers = document.querySelectorAll('#mechanicHandovers-list .e-headercell'); - - headers.forEach(header => { - header.setAttribute('title', header.innerText.trim()); - }); - } -</script> - -<script id="statusColumnTemplate" type="text/x-template"> - ${if(Status == 0)} - <span class="badge bg-warning">Kutilmoqda</span> - ${else if(Status == 1)} - <span class="badge bg-success">Yakunlangan</span> - ${else if(Status == 2)} - <span class="badge bg-danger">Rad etilgan</span> - ${else if(Status == 4)} - <span class="badge bg-danger">Haydovchi tomonidan rad etilgan</span> - ${/if} -</script> - -<script id="carTemplate" type="text/x-template"> - <div> - <a rel='nofollow' href="#" class="car-detail-link" data-id="${CarId}">${CarName}</a> - </div> -</script> - -<div class="modal fade" id="carDetailsModal" tabindex="-1" aria-labelledby="exampleModalLabel" aria-hidden="true"> - <div class="modal-dialog modal-lg"> - <div class="modal-content"> - <div class="modal-header d-flex justify-content-center"> - <h3 class="modal-title" id="detailsModalLabel">Mexanik (Topshirish) ma'lumotari</h3> - <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button> - </div> - <div class="modal-body" id="carDetailsContent"> - </div> - </div> - </div> -</div> - -<script> - document.addEventListener('DOMContentLoaded', function () { - document.addEventListener('click', function (e) { - if (e.target.classList.contains('car-detail-link')) { - e.preventDefault(); - const id = e.target.getAttribute('data-id'); - $.ajax({ - url: `/cars/details/${id}`, - type: 'GET', - success: function (data) { - $('#carDetailsContent').html(data); - $('#carDetailsModal').modal({ - backdrop: 'static', - keyboard: false - }).modal('show'); - }, - error: function () { - $('#carDetailsContent').html('<p>Error loading details</p>'); - } - }); - } - }); - - $('#detailsModal').on('hidden.bs.modal', function () { - $(this).find('#detailsContent').empty(); - }); - }); -</script> - -<script type="text/x-template" id="actionTemplate"> - <button type="button" class="shadow-sm bg-white rounded e-btn e-flat mx-2" title="Tafsilot" onclick="onDetailsClick(${Id})"> - <i class="bi bi-card-list text-info" style="font-size: 19px;"></i> - </button> -</script> - -<div class="modal fade" id="detailsModal" tabindex="-1" aria-labelledby="detailsModalLabel" aria-hidden="true"> - <div class="modal-dialog modal-lg"> - <div class="modal-content"> - <div class="modal-header d-flex justify-content-center"> - <h3 class="modal-title" id="detailsModalLabel">Mexanik (Topshirish) ma'lumotari</h3> - <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button> - </div> - <div class="modal-body" id="detailsContent"> - </div> - </div> - </div> -</div> - -<script> - function onDetailsClick(id) { - $('#detailsContent').empty(); - $.ajax({ - url: `/mechanicHandovers/details/${id}`, - type: 'GET', - contentType: 'application/x-www-form-urlencoded; charset=UTF-8', - success: function (data) { - $('#detailsContent').html(data); - var detailsModal = new bootstrap.Modal(document.getElementById('detailsModal'), { - backdrop: 'static', - keyboard: false - }); - detailsModal.show(); - }, - error: function (error) { - alert("Ma'lumotlarni yuklashda muammo yuz berdi."); - } - }); - } - - $('#detailsModal').on('hidden.bs.modal', function () { - $(this).find('#detailsContent').empty(); - }); -</script> - -<script> - function onChangeSearchAndDate(args) { - const searchInput = document.getElementById("search-box").value.trim(); - const gridElement = document.getElementById("mechanicHandovers-list"); - const gridInstance = gridElement?.ej2_instances?.[0]; - - if (!gridInstance) { - console.error("Grid instance not found."); - return; - } - - if (searchInput) { - gridInstance.search(searchInput); - } else { - gridInstance.searchSettings.key = ""; - } - - gridInstance.refresh(); - } -</script> - -<style> - .e-input-group input { - height: 35px !important; - } - - .search-box { - padding-left: 2rem; - } - - .position-relative .fa-magnifying-glass { - pointer-events: none; - z-index: 1; - } - - button { - height: 37px; - } - - .e-pager .e-pagerexternalmsg { - display: none; - } - - .modal-content { - width: 90%; - } -</style> \ No newline at end of file diff --git a/CheckDrive.Web/CheckDrive.Web/Views/MechanicHandovers/PersonalIndex.cshtml b/CheckDrive.Web/CheckDrive.Web/Views/MechanicHandovers/PersonalIndex.cshtml deleted file mode 100644 index f8ed38e4..00000000 --- a/CheckDrive.Web/CheckDrive.Web/Views/MechanicHandovers/PersonalIndex.cshtml +++ /dev/null @@ -1,442 +0,0 @@ -@model IEnumerable<CheckDrive.ApiContracts.MechanicHandover.MechanicHandoverDto> -<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script> <!-- jQuery --> -<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-icons/1.10.0/font/bootstrap-icons.min.css"> - -@{ - ViewData["Title"] = "Mechanic Handovers (Personal)"; - Layout = "~/Views/Shared/_PersonalLayout.cshtml"; -} - -<form method="get" action="@Url.Action("PersonalIndex")"> - <div class="container mt-5"> - <div class="row justify-content-between align-items-center mb-4"> - <div class="col-md-4"> - <div class="input-group"> - <input type="text" class="form-control rounded-left" placeholder="Haydovchini kiriting ..." name="searchString" value="@ViewBag.SearchString"> - <div class="input-group-append"> - <button type="submit" class="btn btn-primary"> - <i class="fa fa-search"></i> Qidirish - </button> - </div> - </div> - </div> - <div class="col-md-8 d-flex justify-content-end align-items-center gap-2"> - <button class="btn btn-outline-info dropdown-toggle" type="button" id="dropdownMenuButton" data-bs-toggle="dropdown" aria-expanded="false"> - <i class="fa-solid fa-download"></i> Yuklab olish - </button> - <div class="dropdown-menu p-3" id="dropdownMenu" aria-labelledby="dropdownMenuButton" data-bs-auto-close="outside"> - <ejs-calendar id="calendar" change="valueChange" Start="Year" Depth="Year"></ejs-calendar> - <a class="dropdown-item mt-2 btn btn-info" href="#" id="downloadButton">Yuklash</a> - </div> - <a class="btn btn-primary" href="@Url.Action("CarHistoryIndex", "Cars")">Moshina tarixi</a> - <button type="button" id="openCreteMechanicHandoverModal" class="btn btn-success"> - <i class="fa fa-plus"></i> Yaratish - </button> - </div> - </div> - <div class="table-responsive"> - <table class="table table-bordered table-striped table-hover paper-shadow"> - <thead> - <tr> - <th scope="col">Haydovchi F.I</th> - <th scope="col">Sana</th> - <th scope="col">Holati</th> - </tr> - </thead> - <tbody> - @if (Model != null && Model.Any()) - { - foreach (var item in Model) - { - <tr> - <td class="text-center vertical-align-middle"> - @if (item.Status == CheckDrive.ApiContracts.StatusForDto.Unassigned) - { - <a href="javascript:void(0);" - class="openMechanicHandoverReviewModal" - data-driver-id = "@item.DriverId" - data-driver-name = "@item.DriverName"> - @item.DriverName - </a> - } - else - { - @item.DriverName - } - </td> - <td>@item.Date.ToString("dd.MM.yyyy")</td> - <td class="text-center"> - @if (item.Status == CheckDrive.ApiContracts.StatusForDto.Pending) - { - <span class="badge bg-pending ">Kutilmoqda</span> - } - else if (item.Status == CheckDrive.ApiContracts.StatusForDto.Unassigned) - { - <span class="badge bg-unassigned ">Tayinlanmagan</span> - } - else if (item.Status == CheckDrive.ApiContracts.StatusForDto.Completed) - { - <span class="badge bg-success ">Yakunlangan</span> - } - else if (item.Status == CheckDrive.ApiContracts.StatusForDto.RejectedByDriver) - { - <span class="badge bg-danger ">Haydovchi tomonidan rad etilgan</span> - } - else if (item.Status == CheckDrive.ApiContracts.StatusForDto.Rejected) - { - <span class="badge bg-danger ">Rad etilgan</span> - } - else - { - <span class="badge bg-empty ">No`malum holat</span> - } - </td> - </tr> - } - } - else - { - <tr> - <td colspan="9" class="text-center"> - Maʼlumotlar mavjud emas - </td> - </tr> - } - </tbody> - </table> - <div class="d-flex justify-content-between align-items-center my-2"> - <nav aria-label="Page navigation"> - <ul class="pagination"> - @if (ViewBag.HasPreviousPage) - { - <li class="page-item"> - <a class="page-link" href="@Url.Action("PersonalIndex", new { pageNumber = 1 })" aria-label="First"> - <span aria-hidden="true">«</span> - </a> - </li> - <li class="page-item"> - <a class="page-link" href="@Url.Action("PersonalIndex", new { pageNumber = ViewBag.CurrentPage - 1 })">@(@ViewBag.CurrentPage - 1)</a> - </li> - } - @if (ViewBag.HasNextPage) - { - <li class="page-item active"> - <span class="page-link">@ViewBag.CurrentPage</span> - </li> - <li class="page-item"> - <a class="page-link" href="@Url.Action("PersonalIndex", new { pageNumber = ViewBag.CurrentPage + 1 })">@(@ViewBag.CurrentPage + 1)</a> - </li> - <li class="page-item"> - <a class="page-link" href="@Url.Action("PersonalIndex", new { pageNumber = ViewBag.PageCount })" aria-label="Last"> - <span aria-hidden="true">»</span> - </a> - </li> - } - </ul> - </nav> - <div class="p-2"> - <p class="h6 mb-0">@ViewBag.PageCount sahifadan @ViewBag.CurrentPage tasi ( umumiy ishchilar soni: @ViewBag.TotalCount)</p> - </div> - </div> - </div> - </div> -</form> -<!-- Modal oyna --> -<div class="modal fade" id="createMechanicHandoverReviewModal" tabindex="-1" aria-labelledby="createDoctorReviewModalLabel" aria-hidden="true"> - <div class="modal-dialog modal-lg "> - <div class="modal-content"> - <div class="modal-header d-flex justify-content-center"> - <h5 id="createMechanicHandoverReviewModalLabel">Ro'yxatga olish</h5> - <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"> - <span aria-hidden="true"></span> - </button> - </div> - <div class="modal-body" id="modalContent"> - </div> - </div> - </div> -</div> - -@section Scripts { - <script type="text/javascript"> - - $(document).ready(function () { - - $('#openCreteMechanicHandoverModal').on('click', function () { - $('#modalContent').empty(); - $.ajax({ - url: '/mechanichandovers/create', - type: 'GET', - contentType: 'application/x-www-form-urlencoded; charset=UTF-8', - headers: { - 'RequestVerificationToken': $('input[name="__RequestVerificationToken"]').val() - }, - success: function (data) { - $('#modalContent').html(data); - $('#createMechanicHandoverReviewModal').modal('show'); - - // Forma yuklangandan keyin hodisalarni bog'lash - var form = document.getElementById('mechanicHandoverForm'); - var checkbox = document.getElementById('flexSwitchCheckDefault'); - var checkboxLabel = document.querySelector('label[for="flexSwitchCheckDefault"]'); - var carDropdown = document.getElementById('carIdDropdown'); - var distanceInputContainer = document.getElementById('distanceInputContainer'); - var distanceInput = document.querySelector('input[name="Distance"]'); - var fuelInput = document.querySelector('input[name="RemainingFuel"]'); - var mileage = 0; - - function toggleCheckboxHighlight() { - if (checkbox.checked) { - checkbox.classList.remove('border-danger'); - checkboxLabel.classList.remove('text-danger'); - distanceInputContainer.style.display = 'block'; - } else { - checkbox.classList.add('border-danger'); - checkboxLabel.classList.add('text-danger'); - distanceInputContainer.style.display = 'none'; - } - } - - toggleCheckboxHighlight(); - checkbox.addEventListener('change', toggleCheckboxHighlight); - - carDropdown.addEventListener('change', function () { - var selectedCarId = carDropdown.value; - if (selectedCarId) { - fetch(`/MechanicHandovers/GetCarDetails?carId=${selectedCarId}`) - .then(response => response.json()) - .then(data => { - if (data && data.mileage !== undefined) { - mileage = data.mileage; - distanceInput.value = mileage; - distanceInput.setAttribute('min', mileage); - } - if (data && data.remainingFuel !== undefined) { - fuelInput.value = data.remainingFuel; - } - }) - .catch(error => console.error('Error fetching car details:', error)); - } - }); - - form.addEventListener('submit', function (event) { - var distanceValue = Number(distanceInput.value); - var isGiven = checkbox.checked; - - if (distanceValue < mileage) { - event.preventDefault(); - alert("Masofa mashinaning mavjud yurgan masofasidan kam bo'lishi mumkin emas!"); - } else if (distanceValue === 0 && isGiven) { - event.preventDefault(); - alert("Boshlang'ich masofani kiritishingiz shart!"); - } - }); - }, - error: function () { - alert('Create formani yuklashda xatolik yuz berdi.'); - } - }); - }); - }); - $('#createMechanicHandoverReviewModal').on('hidden.bs.modal', function () { - $(this).find('#modalContent').empty(); // Modal yopilganda ichki kontentni tozalash - }); - - </script> -} - -<script> - $(document).ready(function () { - $('.openMechanicHandoverReviewModal').click(function (e) { - e.preventDefault(); - var driverId = $(this).data('driver-id'); - var driverName = $(this).data('driver-name'); - $.ajax({ - url: "/mechanichandovers/create?driverid=" + driverId + "&driverName=" + driverName, - type: 'GET', - data: { id: driverId }, - success: function (data) { - $('#modalContent').html(data); - $('#createMechanicHandoverReviewModal').modal('show'); - // Forma yuklangandan keyin hodisalarni bog'lash - var form = document.getElementById('mechanicHandoverForm'); - var checkbox = document.getElementById('flexSwitchCheckDefault'); - var checkboxLabel = document.querySelector('label[for="flexSwitchCheckDefault"]'); - var carDropdown = document.getElementById('carIdDropdown'); - var distanceInputContainer = document.getElementById('distanceInputContainer'); - var distanceInput = document.querySelector('input[name="Distance"]'); - var fuelInput = document.querySelector('input[name="RemainingFuel"]'); - var mileage = 0; - - function toggleCheckboxHighlight() { - if (checkbox.checked) { - checkbox.classList.remove('border-danger'); - checkboxLabel.classList.remove('text-danger'); - distanceInputContainer.style.display = 'block'; - } else { - checkbox.classList.add('border-danger'); - checkboxLabel.classList.add('text-danger'); - distanceInputContainer.style.display = 'none'; - } - } - - toggleCheckboxHighlight(); - checkbox.addEventListener('change', toggleCheckboxHighlight); - - carDropdown.addEventListener('change', function () { - var selectedCarId = carDropdown.value; - if (selectedCarId) { - fetch(`/MechanicHandovers/GetCarDetails?carId=${selectedCarId}`) - .then(response => response.json()) - .then(data => { - if (data && data.mileage !== undefined) { - mileage = data.mileage; - distanceInput.value = mileage; - distanceInput.setAttribute('min', mileage); - } - if (data && data.remainingFuel !== undefined) { - fuelInput.value = data.remainingFuel; - } - }) - .catch(error => console.error('Error fetching car details:', error)); - } - }); - - form.addEventListener('submit', function (event) { - var distanceValue = Number(distanceInput.value); - var isGiven = checkbox.checked; - - if (distanceValue < mileage) { - event.preventDefault(); - alert("Masofa mashinaning mavjud yurgan masofasidan kam bo'lishi mumkin emas!"); - } else if (distanceValue === 0 && isGiven) { - event.preventDefault(); - alert("Boshlang'ich masofani kiritishingiz shart!"); - } - }); - }, - error: function (xhr, status, error) { - // Xatolik yuz berganda - alert('Xatolik: ' + error); - } - }); - }); - }); -</script> - -<script> - // Default selected year and month - let selectedYear = new Date().getFullYear(); // Current year - let selectedMonth = new Date().getMonth() + 1; // Current month (months are zero-based) - - // Function to handle the change event in the calendar - function valueChange(args) { - var selectedDate = args.value; - selectedYear = selectedDate.getFullYear(); - selectedMonth = selectedDate.getMonth() + 1; // Months are zero-based - - // Optionally, update a label to display the selected date (if you have one) - document.getElementById('date_label').textContent = 'Выбранное значение: ' + selectedDate.toDateString(); - } - - // Prevent the dropdown from closing when clicking inside - document.getElementById('dropdownMenu').addEventListener('click', function (event) { - event.stopPropagation(); // Stops the dropdown from closing when interacting with its contents - }); - - // Handle the download button click - document.getElementById('downloadButton').addEventListener('click', function (e) { - e.preventDefault(); // Prevent the default action of the link - - // Construct the download URL using the selected year and month - const url = `/MechanicHandovers/Download?year=${selectedYear}&month=${selectedMonth}`; - - // Create a temporary link to trigger the download - const link = document.createElement('a'); - link.href = url; - link.setAttribute('download', ''); // Add download attribute to force download - document.body.appendChild(link); - link.click(); - document.body.removeChild(link); // Clean up - - // Manually close the dropdown after downloading - const dropdown = bootstrap.Dropdown.getInstance(document.getElementById('dropdownMenuButton')); - dropdown.hide(); - }); -</script> - -<style> - .modal-content { - width:450px; - } - .nav-tabs .nav-link.active { - background-color: #007bff; - color: white; - } - - .nav-tabs .nav-link { - border: 1px solid #dee2e6; - } - - .badge { - font-size: 0.8rem; - padding: 5px 10px; - border-radius: 5px; - } - - .bg-pending { - background-color: orange; - } - - .bg-unassigned { - background-color: slategray; - } - - .bg-success { - background-color: #28a745; - } - - .bg-danger { - background-color: #dc3545; - } - - .bg-secondary { - background-color: #6c757d; - } - - .container { - margin-top: 30px; - } - - .table-bordered { - border: 1px solid #dee2e6; - } - - .table-bordered th, - .table-bordered td { - border: 1px solid #dee2e6; - } - - .paper-shadow { - background: white; - box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); - border-radius: 10px; - } - - .pagination { - justify-content: flex-end; - } - - .shadow { - box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); - } - - .pagination .page-link { - margin-left: 5px; - } - - .pagination .page-item.shadow { - box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); - } - -</style> \ No newline at end of file diff --git a/CheckDrive.Web/CheckDrive.Web/Views/OilMarks/Create.cshtml b/CheckDrive.Web/CheckDrive.Web/Views/OilMarks/Create.cshtml index a4c3b2c7..12b21097 100644 --- a/CheckDrive.Web/CheckDrive.Web/Views/OilMarks/Create.cshtml +++ b/CheckDrive.Web/CheckDrive.Web/Views/OilMarks/Create.cshtml @@ -1,19 +1,19 @@ -@model CheckDrive.ApiContracts.OilMark.OilMarkForCreateDto +@using CheckDrive.Web.Requests.OilMark +@model CreateOilMarkRequest @{ ViewData["Title"] = "Create"; + Layout = "~/Views/Shared/_LayoutForModal.cshtml"; } -<h4 class="d-flex justify-content-center">Yangi yoqilg'i turini yaratish</h4> -<hr /> -<div style="width : 1100px"> - <div class="col-md-5 mb-3"> +<div class="oilMarkModal"> + <div class="mb-3"> <form asp-action="Create"> <div asp-validation-summary="ModelOnly" class="text-danger"></div> <div class=""> - <label asp-for="OilMark" class="control-label"> Yoqilg'i turini kiriting</label> - <input asp-for="OilMark" class="form-control" required /> - <span asp-validation-for="OilMark" class="text-danger"></span> + <label asp-for="Name" class="control-label"> Yoqilg'i nomini kiriting</label> + <input asp-for="Name" class="form-control" /> + <span asp-validation-for="Name" class="text-danger"></span> </div> <div class="form-group mt-3 d-flex justify-content-center "> <button type="submit" class="btn btn-success" style="width:200px"> diff --git a/CheckDrive.Web/CheckDrive.Web/Views/OilMarks/Delete.cshtml b/CheckDrive.Web/CheckDrive.Web/Views/OilMarks/Delete.cshtml index a6995e50..bd29d6e6 100644 --- a/CheckDrive.Web/CheckDrive.Web/Views/OilMarks/Delete.cshtml +++ b/CheckDrive.Web/CheckDrive.Web/Views/OilMarks/Delete.cshtml @@ -1,4 +1,5 @@ -@model CheckDrive.ApiContracts.OilMark.OilMarkDto +@using CheckDrive.Web.ViewModels.OilMark +@model OilMarkViewModel @{ ViewData["Title"] = "Delete"; @@ -6,7 +7,7 @@ } <h1 class="text-center mb-5 text-danger"><i class="fa fa-exclamation-circle" style="font-size:100px"></i></h1> <h4 style="color:grey;"> - Haqiqatan ham <b style="color:black;">@Model.OilMark</b> ni oʻchirib tashlamoqchimisiz? + Haqiqatan ham <b style="color:black;">@Model.Name</b> ni oʻchirib tashlamoqchimisiz? O'chirsangiz bu yoqilg'i turidan foydalangan barcha ma'lumotlar ham o'chiriladi!!! </h4> diff --git a/CheckDrive.Web/CheckDrive.Web/Views/OilMarks/Edit.cshtml b/CheckDrive.Web/CheckDrive.Web/Views/OilMarks/Edit.cshtml index a6082e67..9d3de228 100644 --- a/CheckDrive.Web/CheckDrive.Web/Views/OilMarks/Edit.cshtml +++ b/CheckDrive.Web/CheckDrive.Web/Views/OilMarks/Edit.cshtml @@ -1,17 +1,19 @@ -@model CheckDrive.ApiContracts.OilMark.OilMarkDto +@using CheckDrive.Web.Requests.OilMark +@model UpdateOilMarkRequest @{ ViewData["Title"] = "Edit"; Layout = "~/Views/Shared/_LayoutForModal.cshtml"; } -<div style="width : 1000px"> - <div class="col-md-5 mb-3"> +<div class="oilMarkModal"> + <div class="mb-3"> <form asp-action="Edit"> <div asp-validation-summary="ModelOnly" class="text-danger"></div> + <input type="hidden" asp-for="Id"/> <div class=""> - <label asp-for="OilMark" class="control-label">Yo'qilg'i turi nomi</label> - <input asp-for="OilMark" class="form-control" required /> - <span asp-validation-for="OilMark" class="text-danger"></span> + <label asp-for="Name" class="control-label">Yo'qilg'i turi nomi</label> + <input asp-for="Name" class="form-control" required /> + <span asp-validation-for="Name" class="text-danger"></span> </div> <div class="form-group mt-3 d-flex justify-content-center"> <button type="submit" class="btn btn-success" style="width:200px"> diff --git a/CheckDrive.Web/CheckDrive.Web/Views/OilMarks/Index.cshtml b/CheckDrive.Web/CheckDrive.Web/Views/OilMarks/Index.cshtml index 86ff40d4..6d97196f 100644 --- a/CheckDrive.Web/CheckDrive.Web/Views/OilMarks/Index.cshtml +++ b/CheckDrive.Web/CheckDrive.Web/Views/OilMarks/Index.cshtml @@ -1,29 +1,22 @@ -@using CheckDrive.ApiContracts.OilMark -@model IEnumerable<CheckDrive.ApiContracts.OilMark.OilMarkDto> +@using CheckDrive.Web.ViewModels.OilMark +@model List<OilMarkViewModel> @{ - ViewData["Title"] = "Index"; + ViewData["Title"] = "Yoqilg'ilar"; + Layout = "~/Views/Shared/_Layout.cshtml"; } -<div> - <div class="d-flex flex-row-reverse"> - <button id="createoilBtn" class="btn btn-success create-btn mt-4" > - <i class="fa fa-plus"></i> Yaratish - </button> - <div id="createoilModal" class="modal" > - <div class="modal-dialog modal-lg modal-dialog-centered"> - <div class="modal-content d-flex justify-content-center" style="height: 250px; width: 500px "> - <span class="close"> - <button class="btn btn-close "></button> - </span> - <partial name="Create" model="new OilMarkForCreateDto()" /> - </div> - </div> - </div> - </div> -</div> +@section Scripts { + <script src="~/js/oilMark.js"></script> +} -<div class="row mt-4"> + <div class="d-flex flex-row-reverse"> + <button id="openOilCreateModal" data-toggle="modal" class="btn btn-success open-modal" type="button" style="width: 10%"> + <i class="fa fa-plus"></i> Yangi + </button> + </div> + +<div class="row mt-1"> <div class="col-12"> <ejs-grid id="oilMarks-list" dataSource="@Model" @@ -32,13 +25,29 @@ allowSorting="true"> <e-grid-pagesettings pageSize="10"></e-grid-pagesettings> <e-grid-columns> - <e-grid-column headerText="Yoqilg'i nomi" field="OilMark" textAlign="Center" width="200" headerTextAlign="Center" ></e-grid-column> + <e-grid-column headerTaxt="Id" field="Id" textAlign="Center" width="30" headerTextAlign="Center"></e-grid-column> + <e-grid-column headerText="Yoqilg'i nomi" field="Name" textAlign="Center" width="200" headerTextAlign="Center" ></e-grid-column> <e-grid-column width="180" type="text" textAlign="Center" template="#actionTemplate"></e-grid-column> </e-grid-columns> </ejs-grid> </div> </div> +<div class="modal fade" id="createOilModal" tabindex="-1" aria-labelledby="exampleModalLabel" aria-hidden="true"> + <div class="modal-dialog modal-lg modal-dialog-centered"> + <div class="modal-content"> + <div class="modal-header d-flex justify-content-center"> + <h4 class="modal-title">Yangi yoqilg'i qo'shish</h4> + <button type="button" class="btn-close" data-bs-dismiss="modal" data-target="#createOilModal"> + <span aria-hidden="true"></span> + </button> + </div> + <div class="modal-body" id="oilModalContent"> + </div> + </div> + </div> +</div> + <div class="modal fade" id="deleteOilModal" tabindex="-1" aria-labelledby="exampleModalLabel" aria-hidden="true"> <div class="modal-dialog modal-lg modal-dialog-centered"> <div class="modal-content"> @@ -50,7 +59,7 @@ <div class="modal fade" id="oilEditModal" tabindex="-1" aria-labelledby="exampleModalLabel" aria-hidden="true"> <div class="modal-dialog modal-lg modal-dialog-centered "> - <div class="modal-content" style="height: 250px; width: 500px "> + <div class="modal-content"> <div class="modal-header d-flex justify-content-center"> <h4>Yoqilg'i ma`lumotini o`zgartirish</h4> <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"> @@ -68,83 +77,7 @@ <button type="button" class="shadow-sm bg-white rounded e-btn e-flat" title="Tahrirlash" onclick="onEditClick(${Id})"> <i class="fa-solid fa-pen fa-lg text-warning" ></i> </button> - <button type="button" class="shadow-sm bg-white rounded e-btn e-flat mx-2" title="O'chirish" onclick="onDeleteClick(${Id})"> + <button type="button" class="shadow-sm bg-white rounded e-btn e-flat mx-2" title="O'chirish" @* onclick="onDeleteClick(${Id})" *@> <i class="fa-solid fa-trash-can fa-lg text-danger"></i> </button> </script> - -<script type="text/javascript"> - function onEditClick(id) { - $('#oilEditModalContent').empty(); - $.ajax({ - url: "/oilmarks/edit/" + id, - type: 'GET', - success: function (data) { - $('#oilEditModalContent').html(data); - $('#oilEditModal').modal({ - backdrop: 'static', - keyboard: false - }).modal('show'); - - }, - error: function (error) { - alert("Tahrirlash oynasini ochishda muommo bo'ldi \n" + error); - } - }); - $(this).find('#oilEditModalContent').empty(); - $(this).off('hidden.bs.modal'); - - } -</script> - - -<script> - function onDeleteClick(id) { - $('#deleteOilContent').empty(); - $.ajax({ - url: "/oilmarks/delete/" + id, - type: 'GET', - success: function (data) { - $('#deleteOilContent').html(data); - $('#deleteOilModal').modal('show'); - }, - error: function () { - $('#deleteOilContent').html('<p>Error loading details</p>'); - } - }); - - $(this).find('#deleteOilContent').empty(); - $(this).off('hidden.bs.modal'); - } -</script> - -<script> - var modal = document.getElementById("createoilModal"); - var btn = document.getElementById("createoilBtn"); - var span = document.getElementsByClassName("close")[0]; - var form = document.getElementById("createForm"); - - btn.onclick = function (event) { - event.preventDefault(); - modal.style.display = "block"; - } - - span.onclick = function () { - modal.style.display = "none"; - } - - form.onsubmit = function (event) { - event.preventDefault(); - alert("Form submit qilindi, lekin sahifa yangilanmaydi."); - } - - modalContent.onclick = function (event) { - event.stopPropagation(); - } - - window.onclick = function (event) { - if (event.target == modal) { - modal.style.display = "none"; - } - } -</script> diff --git a/CheckDrive.Web/CheckDrive.Web/Views/OperatorReviews/Create.cshtml b/CheckDrive.Web/CheckDrive.Web/Views/OperatorReviews/Create.cshtml deleted file mode 100644 index 12c15c24..00000000 --- a/CheckDrive.Web/CheckDrive.Web/Views/OperatorReviews/Create.cshtml +++ /dev/null @@ -1,179 +0,0 @@ -@model CheckDrive.ApiContracts.OperatorReview.OperatorReviewForCreateDto -<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet"> -<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/js/bootstrap.bundle.min.js"></script> - -@{ - ViewData["Title"] = "Create"; - Layout = "~/Views/Shared/_LayoutForModal.cshtml"; - bool noDriversAvailable = ViewBag.NoDriversAvailable ?? false; -} - -<form id="operatorReviewForm" asp-action="Create" method="post"> - <div class="d-flex justify-content-center" style="width:600px"> - <div class="col-md-9 mt-1 "> - @if (noDriversAvailable) - { - <div class="alert alert-warning"> - <strong>Diqqat!</strong> Hozirda mavjud haydovchilar yo'q. Iltimos, keyinroq qayta urinib ko'ring. - </div> - } - - <fieldset style="width:130%" @(noDriversAvailable ? "disabled" : "")> - <div asp-validation-summary="ModelOnly" class="text-danger"></div> - - <div class="form-group w-75"> - <label asp-for="DriverId" class="control-label mt-2">Haydovchi</label> - @if (ViewBag.IsNull == "NotNull") - { - <select class="form-control border border-dark" disabled> - <option value="@ViewBag.SelectedDriverId" selected>@ViewBag.SelectedDriverName</option> - </select> - <input type="hidden" name="DriverId" value="@ViewBag.SelectedDriverId" /> - } - else - { - <select asp-for="DriverId" class="form-control border form-select border-dark" asp-items="@ViewBag.Drivers" id="driverDropdown"> - <option value="">Haydovchini tanlang</option> - @* Other driver options will go here *@ - </select> - } - </div> - - <div class="form-group w-75"> - <label asp-for="CarId" class="control-label mt-2">Moshina</label> - <select asp-for="CarId" class="form-control form-select border border-dark" id="carDropdown"> - @if (ViewBag.SelectedCar != null) - { - <option value="@ViewBag.SelectedCarId" selected>@ViewBag.SelectedCar</option> - } - </select> - </div> - - <div class="form-check form-switch mt-3 w-75"> - <input asp-for="IsGiven" class="form-check-input" type="checkbox" role="switch" id="flexSwitchCheckDefault" value="true"> - <label asp-for="IsGiven" class="form-check-label" for="flexSwitchCheckDefault">Yoqilg`i quyildimi?</label> - </div> - - <input type="hidden" asp-for="OperatorId" value="@ViewBag.OperatorId" /> - - <div class="form-group w-75"> - <label asp-for="OilAmount" class="control-label">Yoqilg`i miqdori</label> - <input asp-for="OilAmount" class="form-control" id="OilAmount" type="number" step="0.01" min="0" /> - <span asp-validation-for="OilAmount" class="text-danger"></span> - </div> - - <div class="form-group w-75"> - <label asp-for="OilMarkId" class="control-label mt-2">Yoqilgi Markasi</label> - <select asp-for="OilMarkId" class="form-control border form-select border-dark" asp-items="ViewBag.OilMarks"></select> - </div> - - <div class="form-group w-75 mt-3"> - <label asp-for="Comments" for="exampleFormControlTextarea1">Izoh</label> - <textarea asp-for="Comments" class="form-control" rows="4"></textarea> - </div> - </fieldset> - - <div class="d-flex justify-content-center mt-4"> - <button type="submit" class="btn btn-success" style="width:50%"> - Saqlash - </button> - </div> - </div> - </div> -</form> - -<div class="modal fade" id="validationErrorModal" tabindex="-1" role="dialog" aria-labelledby="validationErrorModalLabel" aria-hidden="true"> - <div class="modal-dialog" role="document"> - <div class="modal-content"> - <div class="modal-header"> - <h5 class="modal-title" id="validationErrorModalLabel">Xatolik</h5> - </div> - <div class="modal-body" id="validationErrorMessage"> - </div> - </div> - </div> -</div> - -<script> - document.addEventListener('DOMContentLoaded', function () { - var driverDropdown = document.getElementById('driverDropdown'); - var carDropdown = document.getElementById('carDropdown'); - - var fuelTankCapacitys = 0; - var remainingFuels = 0; - - driverDropdown.addEventListener('change', function () { - var driverId = this.value; - $.ajax({ - url: '@Url.Action("GetCarByDriverId")', - type: 'GET', - data: { driverId: driverId }, - success: function (response) { - if (response.success) { - var car = response.car; - fuelTankCapacitys = parseFloat(car.fuelTankCapacity) || 0; - remainingFuels = parseFloat(car.remainingFuel) || 0; - carDropdown.innerHTML = `<option value="${car.id}" selected>${car.model} - Sig'imi: ${car.fuelTankCapacity} litr, Qoldig'i: ${car.remainingFuel} litr</option>`; - document.getElementById('CarId').value = car.id; - - } else { - carDropdown.innerHTML = `<option value="" selected>Moshina mavjud emas</option>`; - document.getElementById('CarId').value = ''; - } - }, - error: function () { - carDropdown.innerHTML = `<option value="" selected>Moshina mavjud emas</option>`; - document.getElementById('CarId').value = ''; - } - }); - }); - - var form = document.getElementById('operatorReviewForm'); - form.addEventListener('submit', function (event) { - var oilAmountInput = document.getElementById('OilAmount'); - var oilAmount = parseFloat(oilAmountInput.value) || 0; - var fuelTankCapacity = parseFloat('@ViewBag.FuelTankCapacity') || fuelTankCapacitys; - var remainingFuel = parseFloat('@ViewBag.RemainingFuel') || remainingFuels; - var checkbox = document.getElementById('flexSwitchCheckDefault'); - - if (checkbox.checked && (remainingFuel + oilAmount) > fuelTankCapacity) { - var errorMessage = `Diqqat: Umumiy yoqilg'i miqdori bak sig'imidan oshib ketmoqda! Yoqilgi 0 va ${fuelTankCapacity - remainingFuel} bolishi kerak`; - - oilAmountInput.classList.add('is-invalid'); - event.preventDefault(); - - document.getElementById('validationErrorMessage').textContent = errorMessage; - $('#validationErrorModal').modal('show'); - } else if (!checkbox.checked && oilAmount > 0) { - var errorMessage = `Diqqat: Yoqilgi berdingiz ammo quydim tugmasini berishni unutdingiz!`; - - oilAmountInput.classList.add('is-invalid'); - event.preventDefault(); - - document.getElementById('validationErrorMessage').textContent = errorMessage; - $('#validationErrorModal').modal('show') - } - }); - }); -</script> - -<style> - .border-danger { - border: 2px solid red !important; - } - - .text-danger { - color: red !important; - } - - fieldset[disabled] .form-control, - fieldset[disabled] .btn { - background-color: #e9ecef; - cursor: not-allowed; - } - - fieldset[disabled] .form-control:disabled, - fieldset[disabled] .btn:disabled { - opacity: 1; - } -</style> diff --git a/CheckDrive.Web/CheckDrive.Web/Views/OperatorReviews/Delete.cshtml b/CheckDrive.Web/CheckDrive.Web/Views/OperatorReviews/Delete.cshtml deleted file mode 100644 index 0b68389c..00000000 --- a/CheckDrive.Web/CheckDrive.Web/Views/OperatorReviews/Delete.cshtml +++ /dev/null @@ -1,85 +0,0 @@ -@model CheckDrive.ApiContracts.OperatorReview.OperatorReviewDto - -@{ - ViewData["Title"] = "Delete"; -} - -<h1 class="align-items-baseline" style="margin-top: 100px">O'chirish</h1> -<hr /> - -<h3 style="color:grey;"> - Haqiqatan ham buni oʻchirib tashlamoqchimisiz? - O'chirsangiz bu ma`lumotni qayta tiklay olmaysiz!!! -</h3> -<div> - <hr /> - <dl class="row"> - <dt class="col-sm-2"> - Operator F.I.SH: - </dt> - <dd class="col-sm-10"> - @Html.DisplayFor(model => model.OperatorName) - </dd> - <dt class="col-sm-2"> - Haydovchi F.I.SH - </dt> - <dd class="col-sm-10"> - @Html.DisplayFor(model => model.DriverName) - </dd> - <dt class="col-sm-2"> - Avtomobil: - </dt> - <dd class="col-sm-10"> - @Html.DisplayFor(model => model.CarModel) - </dd> - <dt class="col-sm-2"> - Davlat raqami: - </dt> - <dd class="col-sm-10"> - @Html.DisplayFor(model => model.CarNumber) - </dd> - <dt class="col-sm-2"> - Yoqilg'i quyish: - </dt> - <dd class="col-sm-10"> - @(Model.IsGiven.HasValue ? (Model.IsGiven.Value ? "Quyildi" : "Quyilmadi") : "N/A") - </dd> - <dt class="col-sm-2"> - Yoqilg'i miqdori: - </dt> - <dd class="col-sm-10"> - @Html.DisplayFor(model => model.OilAmount) - </dd> - <dt class="col-sm-2"> - Yoqilg'i markasi: - </dt> - <dd class="col-sm-10"> - @Html.DisplayFor(model => model.OilMarks) - </dd> - <dt class="col-sm-2"> - Izoh: - </dt> - <dd class="col-sm-10"> - @Html.DisplayFor(model => model.Comments) - </dd> - <dt class="col-sm-2"> - Avtomobil yoqilg'i sig'imi: - </dt> - <dd class="col-sm-10"> - @Html.DisplayFor(model => model.CarOilCapacity) - </dd> - </dl> - - <form asp-action="Delete"> - <div class="form-group"> - <a asp-action="Index" class="btn btn-outline-info"> - <i class="fa-solid fa-arrow-left-long"></i> - Orqaga - </a> - <button asp-route-itemid="@Model.Id" class="btn btn-outline-danger"> - <i class="fa-solid fa-trash"></i> - O'chirish - </button> - </div> - </form> -</div> diff --git a/CheckDrive.Web/CheckDrive.Web/Views/OperatorReviews/Details.cshtml b/CheckDrive.Web/CheckDrive.Web/Views/OperatorReviews/Details.cshtml deleted file mode 100644 index 46271182..00000000 --- a/CheckDrive.Web/CheckDrive.Web/Views/OperatorReviews/Details.cshtml +++ /dev/null @@ -1,106 +0,0 @@ -@using CheckDrive.ApiContracts -@model CheckDrive.ApiContracts.OperatorReview.OperatorReviewDto - -@{ - ViewData["Title"] = "Details"; - Layout = null; -} - - -<div class="grid-container mt-3"> - <div class="row content"> - <div class="col text-center"> - Operator F.I.SH - </div> - <div class="col text-center"> - Haydovchi F.I.SH - </div> - </div> - <div class="row value"> - <div class="col text-center"> - @Model.OperatorName - </div> - <div class="col text-center"> - @Model.DriverName - </div> - </div> - <div class="row content"> - <div class="col text-center"> - Avtomobil - </div> - <div class="col text-center"> - Davlat raqami - </div> - </div> - <div class="row value"> - <div class="col text-center"> - @Model.CarModel - </div> - <div class="col text-center"> - @Model.CarNumber - </div> - </div> - <div class="row content"> - <div class="col text-center"> - Avtomobil yoqilg'i sig'imi - </div> - <div class="col text-center"> - Holati - </div> - </div> - <div class="row value"> - <div class="col text-center"> - @Model.CarOilCapacity - </div> - <div class="col text-center"> - @{ - string status = Model.Status switch - { - StatusForDto.Pending => "Kutilmoqda", - StatusForDto.Completed => "Yakunlangan", - StatusForDto.Rejected => "Rad etilgan", - StatusForDto.Unassigned => "Tayinlanmagan", - StatusForDto.RejectedByDriver => "Haydovchi tomonidan rad etilgan", - _ => "Noma'lum" - }; - } - @status - </div> - </div> - <div class="row content"> - <div class="col text-center"> - Yoqilg'i quyish - </div> - <div class="col text-center"> - Yoqilg'i miqdori - </div> - <div class="col text-center"> - Yoqilg'i markasi - </div> - </div> - <div class="row value"> - <div class="col text-center"> - @(Model.IsGiven.HasValue ? (Model.IsGiven.Value ? "Quyildi" : "Quyilmadi") : "N/A") - </div> - <div class="col text-center"> - @Model.OilAmount - </div> - <div class="col text-center"> - @Model.OilMarks - </div> - </div> - <div class="row content"> - <div class="col text-center"> - Izoh - </div> - </div> - <div class="row comments"> - <div class="col text-center"> - @if (string.IsNullOrWhiteSpace(Model.Comments)) - { - Model.Comments = "Izoh mavjud emas"; - } - @Model.Comments - </div> - </div> -</div> \ No newline at end of file diff --git a/CheckDrive.Web/CheckDrive.Web/Views/OperatorReviews/Edit.cshtml b/CheckDrive.Web/CheckDrive.Web/Views/OperatorReviews/Edit.cshtml deleted file mode 100644 index c0463b55..00000000 --- a/CheckDrive.Web/CheckDrive.Web/Views/OperatorReviews/Edit.cshtml +++ /dev/null @@ -1,81 +0,0 @@ -@model CheckDrive.ApiContracts.OperatorReview.OperatorReviewDto - -@{ - ViewData["Title"] = "Edit"; - bool isGivenNullable = Model.IsGiven ?? false; -} - -<h4>Ma`lumotni tahrirlash</h4> -<hr /> -<div class="row"> - <div class="col-md-4"> - <form asp-action="Edit"> - <div asp-validation-summary="ModelOnly" class="text-danger"></div> - <div class="form-check form-switch mt-3"> - <input type="hidden" id="IsGiven" name="IsGiven" value="@isGivenNullable.ToString().ToLower()" /> - <input class="form-check-input" type="checkbox" id="IsGivenCheckbox" @(isGivenNullable ? "checked" : "") /> - <label class="form-check-label" for="IsGivenCheckbox">Berildimi?</label> - </div> - <div class="form-group mt-3"> - <label asp-for="OilAmount" class="control-label">Yoqilg'i miqdori</label> - <input asp-for="OilAmount" class="form-control" /> - <span asp-validation-for="OilAmount" class="text-danger"></span> - </div> - <div class="form-group mt-3"> - <label asp-for="OilMarkId" class="control-label mt-2">Yoqilgi Markasi</label> - <select asp-for="OilMarkId" class="form-control border border-dark" asp-items="ViewBag.OilMarks"></select> - </div> - <div class="form-group mt-3"> - <label asp-for="Status" class="control-label">Holati</label> - <select asp-for="Status" class="form-control" asp-items="ViewBag.Status"></select> - <span asp-validation-for="Status" class="text-danger"></span> - </div> - <div class="form-group mt-3"> - <label asp-for="Date" class="control-label">Sana</label> - <input asp-for="Date" class="form-control" /> - <span asp-validation-for="Date" class="text-danger"></span> - </div> - <div class="form-group mt-3"> - <label asp-for="DriverId" class="control-label">Haydovchi F.I.SH</label> - <select asp-for="DriverId" class="form-control" asp-items="ViewBag.DriverSelectList"></select> - <span asp-validation-for="DriverId" class="text-danger"></span> - </div> - <div class="form-group mt-3"> - <label asp-for="CarId" class="control-label">Moshina</label> - <select asp-for="CarId" class="form-control" asp-items="ViewBag.CarSelectList"></select> - <span asp-validation-for="CarId" class="text-danger"></span> - </div> - <div class="form-group mt-2"> - <label asp-for="Comments" class="control-label mt-2">Izoh</label> - <textarea asp-for="Comments" class="form-control" rows="4"></textarea> - </div> - <input type="hidden" asp-for="OperatorId" /> - <div class="form-group mt-3"> - <a asp-action="Details" asp-route-id="@Model?.Id" class="btn btn-outline-info"> - <i class="fa-solid fa-arrow-left-long"></i> - Orqaga - </a> - <button class="btn btn-outline-success"> - <i class="fa fa-pencil"></i> Saqlash - </button> - </div> - </form> - </div> -</div> - -@section Scripts { - <script> - document.addEventListener("DOMContentLoaded", function () { - const isGivenCheckbox = document.getElementById("IsGivenCheckbox"); - const isGivenHidden = document.getElementById("IsGiven"); - - // Initialize checkbox state - isGivenCheckbox.checked = isGivenHidden.value === "true"; - - // Add event listener for checkbox state change - isGivenCheckbox.addEventListener("change", function () { - isGivenHidden.value = isGivenCheckbox.checked.toString().toLowerCase(); - }); - }); - </script> -} diff --git a/CheckDrive.Web/CheckDrive.Web/Views/OperatorReviews/HistoryIndexForPersonalPage.cshtml b/CheckDrive.Web/CheckDrive.Web/Views/OperatorReviews/HistoryIndexForPersonalPage.cshtml deleted file mode 100644 index a9a25be3..00000000 --- a/CheckDrive.Web/CheckDrive.Web/Views/OperatorReviews/HistoryIndexForPersonalPage.cshtml +++ /dev/null @@ -1,259 +0,0 @@ -@model IEnumerable<CheckDrive.ApiContracts.OperatorReview.OperatorReviewDto> -<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-icons/1.10.0/font/bootstrap-icons.min.css"> -<link rel="stylesheet" href="~/css/LogOutButtun.css" asp-append-version="true" /> -@{ - ViewData["Title"] = "HistoryIndexForPersonalPage"; - Layout = "~/Views/Shared/_PersonalLayout.cshtml"; -} - -<form asp-controller="OperatorReviews" asp-action="HistoryIndexForPersonalPage"> - <div class="container mt-5"> - <div class="row justify-content-between align-items-center mb-4"> - <!-- Search --> - <div class="col-md-4"> - <div class="input-group"> - <input type="text" class="form-control rounded-left" placeholder="Haydovchini kiriting ..." name="searchString" value="@ViewBag.SearchString"> - <div class="input-group-append"> - <button type="submit" class="btn btn-primary"> - <i class="fa fa-search"></i> Qidirish - </button> - </div> - </div> - </div> - <div class="col-md-2"> - <input type="date" name="date" class="form-control"> - </div> - </div> - <div class="row justify-content-center"> - <div class="col-md-12"> - <div class="table-responsive"> - <table class="table table-bordered table-striped table-hover shadow"> - <thead> - <tr> - <th class="text-center">Haydovchi F.I.Sh</th> - <th class="text-center">Moshina markasi</th> - <th class="text-center">Moshina raqami</th> - <th class="text-center">Yoqilg`i sig`imi</th> - <th class="text-center">Yoqilg`i qoldig`i</th> - <th class="text-center">Quyilgan yoqilg`i miqdori</th> - <th class="text-center">Yoqilg`i Markasi</th> - <th class="text-center">Yoqilg`i berildimi?</th> - <th class="text-center comments-column">Izoh</th> - <th class="text-center">Holati</th> - <th class="text-center vertical-align-middle">Sana</th> - </tr> - </thead> - <tbody> - @if (Model != null && Model.Any()) - { - @foreach (var review in Model) - { - <tr> - <td class="text-center"> - @if (!string.IsNullOrEmpty(review.OperatorName)) - { - @review.DriverName - } - else - { - <a asp-action="Create" - asp-route-driverId="@review.DriverId" - asp-route-driverName="@review.DriverName" - asp-route-carId="@review.CarId" - asp-route-carModel="@review.CarModel" - asp-route-fuelTankCapacity="@review.CarOilCapacity" - asp-route-remainingFuel="@review.CarOilRemainig">@review.DriverName</a> - } - </td> - <td class="text-center">@review.CarModel</td> - <td class="text-center">@review.CarNumber</td> - <td class="text-center">@review.CarOilCapacity</td> - <td class="text-center">@review.CarOilRemainig</td> - <td class="text-center">@review.OilAmount</td> - <td class="text-center">@review.OilMarks</td> - <td class="text-center"> - @if (review.IsGiven == true) - { - <span class="badge bg-success shadow">Berildi</span> - } - else if (review.IsGiven == false) - { - <span class="badge bg-danger shadow">Berilmadi</span> - } - else - { - <span class="badge bg-empty shadow"></span> - } - </td> - <td class="text-center comments-column">@review.Comments</td> - <td class="text-center"> - @if (review.Status == CheckDrive.ApiContracts.StatusForDto.Pending) - { - <span class="badge bg-pending shadow">Kutilmoqda</span> - } - else if (review.Status == CheckDrive.ApiContracts.StatusForDto.Unassigned) - { - <span class="badge bg-unassigned shadow">Tayinlanmagan</span> - } - else if (review.Status == CheckDrive.ApiContracts.StatusForDto.Completed) - { - <span class="badge bg-success shadow">Yakunlangan</span> - } - else if (review.Status == CheckDrive.ApiContracts.StatusForDto.RejectedByDriver) - { - <span class="badge bg-danger shadow">Haydovchi tomonidan rad etilgan</span> - } - else if (review.Status == CheckDrive.ApiContracts.StatusForDto.Rejected) - { - <span class="badge bg-danger shadow">Rad etilgan</span> - } - else - { - <span class="badge bg-empty shadow">No`malum holat</span> - } - </td> - <td class="text-center vertical-align-middle">@review.Date</td> - </tr> - } - } - else - { - <tr> - <td colspan="11" class="text-center"> - Maʼlumotlar mavjud emas - </td> - </tr> - } - </tbody> - </table> - <div class="d-flex justify-content-between align-items-center my-2"> - <nav aria-label="Page navigation"> - <ul class="pagination"> - @if (ViewBag.HasPreviousPage) - { - <li class="page-item"> - <a class="page-link" href="@Url.Action("HistoryIndexForPersonalPage", new { pageNumber = 1 })" aria-label="First"> - <span aria-hidden="true">«</span> - </a> - </li> - <li class="page-item"> - <a class="page-link" href="@Url.Action("HistoryIndexForPersonalPage", new { pageNumber = ViewBag.CurrentPage - 1 })">@(@ViewBag.CurrentPage - 1)</a> - </li> - } - @if (ViewBag.HasNextPage) - { - <li class="page-item active"> - <span class="page-link">@ViewBag.CurrentPage</span> - </li> - <li class="page-item"> - <a class="page-link" href="@Url.Action("HistoryIndexForPersonalPage", new { pageNumber = ViewBag.CurrentPage + 1 })">@(@ViewBag.CurrentPage + 1)</a> - </li> - <li class="page-item"> - <a class="page-link" href="@Url.Action("HistoryIndexForPersonalPage", new { pageNumber = ViewBag.PageCount })" aria-label="Last"> - <span aria-hidden="true">»</span> - </a> - </li> - } - </ul> - </nav> - <div class="p-2"> - <p class="h6 mb-0">@ViewBag.PageCount sahifadan @ViewBag.CurrentPage tasi ( umumiy tarix soni: @ViewBag.TotalCount)</p> - </div> - </div> - </div> - </div> - </div> - </div> -</form> - -<style> - .nav-tabs .nav-link.active { - background-color: #007bff; - color: white; - } - - .nav-tabs .nav-link { - border: 1px solid #dee2e6; - } - - .badge { - font-size: 0.8rem; - padding: 5px 10px; - border-radius: 5px; - } - - .bg-pending { - background-color: orange; - } - - .bg-unassigned { - background-color: slategray; - } - - .bg-success { - background-color: #28a745; - } - - .bg-danger { - background-color: #dc3545; - } - - .bg-empty { - background-color: gray; - } - - .shadow { - box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); - } - - .table { - width: 100%; - margin: 0 auto; - } - - .table th, .table td { - vertical-align: middle !important; - } - - .container { - margin-top: 30px; - } - - .table-bordered { - border: 1px solid #dee2e6; - } - - .table-bordered th, .table-bordered td { - border: 1px solid #dee2e6; - } - - .pagination { - justify-content: flex-end; - } - - .shadow { - box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); - } - - .text-center { - text-align: center !important; - } - - .text-end { - text-align: end !important; - } - - .mb-3 { - margin-bottom: 1rem !important; - } - - .mt-5 { - margin-top: 3rem !important; - } - - .comments-column { - max-width: 250px; - word-wrap: break-word; - white-space: normal; - } -</style> diff --git a/CheckDrive.Web/CheckDrive.Web/Views/OperatorReviews/Index.cshtml b/CheckDrive.Web/CheckDrive.Web/Views/OperatorReviews/Index.cshtml deleted file mode 100644 index be6f7861..00000000 --- a/CheckDrive.Web/CheckDrive.Web/Views/OperatorReviews/Index.cshtml +++ /dev/null @@ -1,207 +0,0 @@ -@model CheckDrive.ApiContracts.OperatorReview.OperatorReviewDto - -@{ - ViewData["Title"] = "Index"; - Layout = "~/Views/Shared/_Layout.cshtml"; -} - -<form asp-controller="OperatorReviews" asp-action="Index"> - <div class="row mt-4"> - <div class="d-flex justify-content-between mb-4"> - <div class="col-md-4 filter-bar position-relative"> - <div class="position-relative w-100"> - <i class="fa-solid fa-magnifying-glass position-absolute top-50 start-0 translate-middle-y ms-3" style="color: dimgray;"></i> - <ejs-textbox id="search-box" - name="search" - class="search-box ps-5" - placeholder="Izlash..." - floatLabelType="Never" - value="@ViewBag.SearchString" - input="onChangeSearchAndDate"> - </ejs-textbox> - </div> - </div> - <div class="col-md-4 date-filter"> - <div class="d-flex gap-4"> - <ejs-datepicker id="date" - format="dd-MM-yyyy" - placeholder="Sanani tanlang" - floatLabelType="Never" - change="onChangeSearchAndDate"> - </ejs-datepicker> - <button class="btn btn-outline-info dropdown-toggle" type="button" id="dropdownMenuButton" data-bs-toggle="dropdown" aria-expanded="false"> - <i class="fa-solid fa-download"></i> Yuklab olish - </button> - </div> - </div> - </div> - </div> -</form> - -<div class="row"> - <div class="col-12"> - <ejs-grid - id="operatorReview-list" - dataSource="@ViewBag.OperatorsReview" - gridLines="Both" - allowSorting="true" - allowPaging="true" - dataBound="onDataBound"> - <e-grid-pagesettings pageSize="10"></e-grid-pagesettings> - <e-grid-columns> - <e-grid-column headerText="Operator" field="OperatorName" type="string" textAlign=Center headerTextAlign=Center width="200"></e-grid-column> - <e-grid-column headerText="Haydovchi" field="DriverName" type="string" textAlign=Center headerTextAlign=Center width="200"></e-grid-column> - <e-grid-column headerText="Avtomobil" field="CarModel" type="string" textAlign=Center headerTextAlign=Center ></e-grid-column> - <e-grid-column headerText="Ko'rik vaqti" field="Date" type="date" format="dd-MM-yyyy | HH:mm" type="string" textAlign=Center headerTextAlign=Center></e-grid-column> - <e-grid-column headerText="Status" field="Status" template="#statusColumnTemplate" textAlign=Center headerTextAlign=Center width="100"></e-grid-column> - <e-grid-column width="100" type="text" textAlign="Center" template="#actionTemplate"></e-grid-column> - </e-grid-columns> - </ejs-grid> - </div> -</div> - -<script> - let selectedYear = new Date().getFullYear(); - let selectedMonth = new Date().getMonth() + 1; - - function valueChange(args) { - var selectedDate = args.value; - selectedYear = selectedDate.getFullYear(); - selectedMonth = selectedDate.getMonth() + 1; - - document.getElementById('date_label').textContent = 'Выбранное значение: ' + selectedDate.toDateString(); - } - - document.getElementById('dropdownMenu').addEventListener('click', function (event) { - event.stopPropagation(); - }); - - document.getElementById('downloadButton').addEventListener('click', function (e) { - e.preventDefault(); - - const url = `/OperatorReviews/Download?year=${selectedYear}&month=${selectedMonth}`; - - const link = document.createElement('a'); - link.href = url; - link.setAttribute('download', ''); - document.body.appendChild(link); - link.click(); - document.body.removeChild(link); - - const dropdown = bootstrap.Dropdown.getInstance(document.getElementById('dropdownMenuButton')); - dropdown.hide(); - }); - - function onDataBound() { - const headers = document.querySelectorAll('#operatorReview-list .e-headercell'); - - headers.forEach(header => { - header.setAttribute('title', header.innerText.trim()); - }); - } -</script> - -<script id="statusColumnTemplate" type="text/x-template"> - ${if(Status == 0)} - <span class="badge bg-warning">Kutilmoqda</span> - ${else if(Status == 1)} - <span class="badge bg-success">Yakunlangan</span> - ${else if(Status == 2)} - <span class="badge bg-danger">Rad etilgan</span> - ${else if(Status == 4)} - <span class="badge bg-danger">Haydovchi tomonidan rad etilgan</span> - ${/if} -</script> - -<script type="text/x-template" id="actionTemplate"> - <button type="button" class="shadow-sm bg-white rounded e-btn e-flat mx-2" title="Tafsilot" onclick="onDetailsClick(${Id})"> - <i class="bi bi-card-list text-info" style="font-size: 19px;"></i> - </button> -</script> - -<div class="modal fade" id="detailsModal" tabindex="-1" aria-labelledby="detailsModalLabel" aria-hidden="true"> - <div class="modal-dialog modal-lg"> - <div class="modal-content"> - <div class="modal-header d-flex justify-content-center"> - <h3 class="modal-title" id="detailsModalLabel">Operator ko'rigi ma'lumotlari</h3> - <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button> - </div> - <div class="modal-body" id="detailsContent"> - </div> - </div> - </div> -</div> - -<script> - function onDetailsClick(id) { - $('#detailsContent').empty(); - $.ajax({ - url: `/operatorReviews/details/${id}`, - type: 'GET', - contentType: 'application/x-www-form-urlencoded; charset=UTF-8', - success: function (data) { - $('#detailsContent').html(data); - var detailsModal = new bootstrap.Modal(document.getElementById('detailsModal'), { - backdrop: 'static', - keyboard: false - }); - detailsModal.show(); - }, - error: function (error) { - alert("Ma'lumotlarni yuklashda muammo yuz berdi."); - } - }); - } - - $('#detailsModal').on('hidden.bs.modal', function () { - $(this).find('#detailsContent').empty(); - }); -</script> - -<script> - function onChangeSearchAndDate(args) { - const searchInput = document.getElementById("search-box").value.trim(); - const gridElement = document.getElementById("operatorReview-list"); - const gridInstance = gridElement?.ej2_instances?.[0]; - - if (!gridInstance) { - console.error("Grid instance not found."); - return; - } - - if (searchInput) { - gridInstance.search(searchInput); - } else { - gridInstance.searchSettings.key = ""; - } - - gridInstance.refresh(); - } -</script> - -<style> - .e-input-group input { - height: 35px !important; - } - - .search-box { - padding-left: 2rem; - } - - .position-relative .fa-magnifying-glass { - pointer-events: none; - z-index: 1; - } - - button { - height: 37px; - } - - .e-pager .e-pagerexternalmsg { - display: none; - } - - .modal-content { - width: 90%; - } -</style> diff --git a/CheckDrive.Web/CheckDrive.Web/Views/OperatorReviews/PersonalIndex.cshtml b/CheckDrive.Web/CheckDrive.Web/Views/OperatorReviews/PersonalIndex.cshtml deleted file mode 100644 index d41d6d8c..00000000 --- a/CheckDrive.Web/CheckDrive.Web/Views/OperatorReviews/PersonalIndex.cshtml +++ /dev/null @@ -1,509 +0,0 @@ -@model IEnumerable<CheckDrive.ApiContracts.OperatorReview.OperatorReviewDto> -<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script> <!-- jQuery --> -<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-icons/1.10.0/font/bootstrap-icons.min.css"> -<link rel="stylesheet" href="~/css/LogOutButtun.css" asp-append-version="true" /> -@{ - ViewData["Title"] = "PersonalIndex"; - Layout = "~/Views/Shared/_PersonalLayout.cshtml"; -} - -<form asp-controller="OperatorReviews" asp-action="PersonalIndex"> - <div class="container mt-5"> - <div class="row justify-content-between align-items-center mb-4"> - <!-- Search --> - <div class="col-md-4"> - <div class="input-group"> - <input type="text" class="form-control rounded-left" placeholder="Haydovchini kiriting ..." name="searchString" value="@ViewBag.SearchString"> - <div class="input-group-append"> - <button type="submit" class="btn btn-primary"> - <i class="fa fa-search"></i> Qidirish - </button> - </div> - </div> - </div> - - <div class="col-md-8 d-flex justify-content-end align-items-center gap-2"> - <button class="btn btn-outline-info dropdown-toggle" type="button" id="dropdownMenuButton" data-bs-toggle="dropdown" aria-expanded="false"> - <i class="fa-solid fa-download"></i> Yuklab olish - </button> - <div class="dropdown-menu p-3" id="dropdownMenu" aria-labelledby="dropdownMenuButton" data-bs-auto-close="outside"> - <ejs-calendar id="calendar" change="valueChange" Start="Year" Depth="Year"></ejs-calendar> - <a class="dropdown-item mt-2 btn btn-info" href="#" id="downloadButton">Yuklash</a> - </div> - <a class="btn btn-primary" href="@Url.Action("CarHistoryIndex", "Cars")">Moshina tarixi</a> - <button id="openCreateOperatorModal" type="button" class="btn btn-success"> - <i class="fa fa-plus"></i> Yaratish - </button> - </div> - </div> - - <div class="row justify-content-center"> - <div class="col-md-12"> - <div class="table-responsive"> - <table class="table table-bordered table-striped table-hover shadow"> - <thead> - <tr> - <th class="text-center">Haydovchi F.I.SH</th> - <th class="text-center">Moshina markasi</th> - <th class="text-center">Moshina raqami</th> - <th class="text-center">Yoqilg`i sig`imi</th> - <th class="text-center">Yoqilg`i qoldig`i</th> - <th class="text-center">Holati</th> - </tr> - </thead> - <tbody> - @if(Model != null && Model.Any()) - { - @foreach (var review in Model) - { - <tr> - <td class="text-center"> - @if (review.Status != CheckDrive.ApiContracts.StatusForDto.Unassigned) - { - @review.DriverName - } - else - { - <a asp-action="Create" - asp-route-isNull="NotNull" - asp-route-driverId="@review.DriverId" - asp-route-driverName="@review.DriverName" - asp-route-carId="@review.CarId" - asp-route-carModel="@review.CarModel" - asp-route-fuelTankCapacity="@(Convert.ToDouble(review.CarOilCapacity).ToString("F2", System.Globalization.CultureInfo.InvariantCulture).Replace(",", "."))" - asp-route-remainingFuel="@(Convert.ToDouble(review.CarOilRemainig).ToString("F2", System.Globalization.CultureInfo.InvariantCulture).Replace(",", "."))"> - @review.DriverName - </a> - } - </td> - <td class="text-center">@review.CarModel</td> - <td class="text-center">@review.CarNumber</td> - <td class="text-center">@review.CarOilCapacity</td> - <td class="text-center">@review.CarOilRemainig</td> - <td class="text-center"> - @if (review.Status == CheckDrive.ApiContracts.StatusForDto.Pending) - { - <span class="badge bg-pending shadow">Kutilmoqda</span> - } - else if (review.Status == CheckDrive.ApiContracts.StatusForDto.Unassigned) - { - <span class="badge bg-unassigned shadow">Tayinlanmagan</span> - } - else if (review.Status == CheckDrive.ApiContracts.StatusForDto.Completed) - { - <span class="badge bg-success shadow">Yakunlangan</span> - } - else if (review.Status == CheckDrive.ApiContracts.StatusForDto.RejectedByDriver) - { - <span class="badge bg-danger shadow">Haydovchi tomonidan rad etilgan</span> - } - else if (review.Status == CheckDrive.ApiContracts.StatusForDto.Rejected) - { - <span class="badge bg-danger shadow">Rad etilgan</span> - } - else - { - <span class="badge bg-empty shadow">No`malum holat</span> - } - </td> - </tr> - } - } - else - { - <tr> - <td colspan="11" class="text-center"> - Maʼlumotlar mavjud emas - </td> - </tr> - } - </tbody> - </table> - <div class="d-flex justify-content-between align-items-center my-2"> - <nav aria-label="Page navigation"> - <ul class="pagination"> - @if (ViewBag.HasPreviousPage) - { - <li class="page-item"> - <a class="page-link" href="@Url.Action("PersonalIndex", new { pageNumber = 1 })" aria-label="First"> - <span aria-hidden="true">«</span> - </a> - </li> - <li class="page-item"> - <a class="page-link" href="@Url.Action("PersonalIndex", new { pageNumber = ViewBag.CurrentPage - 1 })">@(@ViewBag.CurrentPage - 1)</a> - </li> - } - @if (ViewBag.HasNextPage) - { - <li class="page-item active"> - <span class="page-link">@ViewBag.CurrentPage</span> - </li> - <li class="page-item"> - <a class="page-link" href="@Url.Action("PersonalIndex", new { pageNumber = ViewBag.CurrentPage + 1 })">@(@ViewBag.CurrentPage + 1)</a> - </li> - <li class="page-item"> - <a class="page-link" href="@Url.Action("PersonalIndex", new { pageNumber = ViewBag.PageCount })" aria-label="Last"> - <span aria-hidden="true">»</span> - </a> - </li> - } - </ul> - </nav> - <div class="p-2"> - <p class="h6 mb-0">@ViewBag.PageCount sahifadan @ViewBag.CurrentPage tasi ( umumiy ishchilar soni: @ViewBag.TotalCount)</p> - </div> - </div> - </div> - </div> - </div> - </div> -</form> - -<!-- Modal oyna --> -<div class="modal fade" id="createOperatorReviewModal" tabindex="-1" aria-labelledby="createOperatorReviewModalLabel" aria-hidden="true"> - <div class="modal-dialog modal-lg "> - <div class="modal-content"> - <div class="modal-header d-flex justify-content-center"> - <h5 id="createOperatorReviewModalLabel">Ro'yxatga olish</h5> - <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"> - <span aria-hidden="true"></span> - </button> - </div> - <div class="modal-body d-flex justify-content-center" id="modalContent"> - <!-- Bu yerga forma yuklanadi --> - </div> - </div> - </div> -</div> - -@section Scripts { - <script> - function validateForm() { - var fuelTankCapacity = document.getElementById("fuelTankCapacity").value; - var remainingFuel = document.getElementById("remainingFuel").value; - - if (parseFloat(remainingFuel) > parseFloat(fuelTankCapacity)) { - alert("Avtomobil yoqilg'i qoldig'i yoqilg'i baki sig'imidan katta bo'lmaydi."); - return false; - } - return true; - } - - function validateRemainingFuel() { - var fuelTankCapacity = document.getElementById("fuelTankCapacity").value; - var remainingFuel = document.getElementById("remainingFuel").value; - - if (fuelTankCapacity === "") { - alert("Siz avval 'Yoqilg'i baki sig'imi' ga qiymat kiritishingiz kerak"); - document.getElementById("remainingFuel").value = ""; - return false; - } - - if (parseFloat(remainingFuel) > parseFloat(fuelTankCapacity)) { - alert("Avtomobil yoqilg'i qoldig'i yoqilg'i baki sig'imidan katta bo'lmaydi."); - return false; - } - return true; - } - - function calculateMonthlyDistance() { - var oneYearMediumDistance = document.getElementById("oneYearMediumDistance").value; - var meduimFuelConsumption = document.getElementById("meduimFuelConsumption").value; - - if (meduimFuelConsumption === "") { - alert("Siz avval '100 km uchun yoqilg'i me'yori [litr]' ga qiymat kiritishingiz kerak"); - document.getElementById("oneYearMediumDistance").value = ""; - return; - } - - var monthlyDistance = oneYearMediumDistance / 12; - document.getElementById("monthlyDistance").value = monthlyDistance.toFixed(1); - - var yearlyMediumFuel = oneYearMediumDistance * (meduimFuelConsumption / 100); - document.getElementById("yearlyMediumFuel").value = yearlyMediumFuel.toFixed(1); - - var monthlyMediumFuel = yearlyMediumFuel / 12; - document.getElementById("monthlyMediumFuel").value = monthlyMediumFuel.toFixed(1); - } - - function validateForm() { - var fuelTankCapacity = document.getElementById("fuelTankCapacity").value; - var remainingFuel = document.getElementById("remainingFuel").value; - - if (parseFloat(remainingFuel) > parseFloat(fuelTankCapacity)) { - alert("Avtomobil yoqilg'i qoldig'i yoqilg'i baki sig'imidan katta bo'lmaydi."); - return false; - } - return true; - } - - function validateRemainingFuel() { - var fuelTankCapacity = document.getElementById("fuelTankCapacity").value; - var remainingFuel = document.getElementById("remainingFuel").value; - - if (fuelTankCapacity === "") { - alert("Siz avval 'Yoqilg'i baki sig'imi' ga qiymat kiritishingiz kerak"); - document.getElementById("remainingFuel").value = ""; - return false; - } - - if (parseFloat(remainingFuel) > parseFloat(fuelTankCapacity)) { - alert("Avtomobil yoqilg'i qoldig'i yoqilg'i baki sig'imidan katta bo'lmaydi."); - return false; - } - return true; - } - - function calculateMonthlyDistance() { - var oneYearMediumDistance = document.getElementById("oneYearMediumDistance").value; - var meduimFuelConsumption = document.getElementById("meduimFuelConsumption").value; - - if (meduimFuelConsumption === "") { - alert("Siz avval '100 km uchun yoqilg'i me'yori [litr]' ga qiymat kiritishingiz kerak"); - document.getElementById("oneYearMediumDistance").value = ""; - return; - } - - var monthlyDistance = oneYearMediumDistance / 12; - document.getElementById("monthlyDistance").value = monthlyDistance.toFixed(1); - - var yearlyMediumFuel = oneYearMediumDistance * (meduimFuelConsumption / 100); - document.getElementById("yearlyMediumFuel").value = yearlyMediumFuel.toFixed(1); - - var monthlyMediumFuel = yearlyMediumFuel / 12; - document.getElementById("monthlyMediumFuel").value = monthlyMediumFuel.toFixed(1); - } - - </script> -} - -@*Ajax*@ -<script> - $(document).ready(function () { - $('#openCreateOperatorModal').on('click', function () { - $('#modalContent').empty(); - $.ajax({ - url: '/operatorreviews/create', - type: 'GET', - contentType: 'application/x-www-form-urlencoded; charset=UTF-8', - headers: { - 'RequestVerificationToken': $('input[name="__RequestVerificationToken"]').val() - }, - success: function (data) { - $('#modalContent').html(data); - $('#createOperatorReviewModal').modal('show'); - var driverDropdown = document.getElementById('driverDropdown'); - var carDropdown = document.getElementById('carDropdown'); - - var fuelTankCapacitys = 0; - var remainingFuels = 0; - - driverDropdown.addEventListener('change', function () { - var driverId = this.value; - $.ajax({ - url: '@Url.Action("GetCarByDriverId")', - type: 'GET', - data: { driverId: driverId }, - success: function (response) { - if (response.success) { - var car = response.car; - fuelTankCapacitys = parseFloat(car.fuelTankCapacity) || 0; - remainingFuels = parseFloat(car.remainingFuel) || 0; - carDropdown.innerHTML = `<option value="${car.id}" selected>${car.model} - Sig'imi: ${car.fuelTankCapacity} litr, Qoldig'i: ${car.remainingFuel} litr</option>`; - document.getElementById('CarId').value = car.id; - - } else { - carDropdown.innerHTML = `<option value="" selected>Moshina mavjud emas</option>`; - document.getElementById('CarId').value = ''; - } - }, - error: function () { - carDropdown.innerHTML = `<option value="" selected>Moshina mavjud emas</option>`; - document.getElementById('CarId').value = ''; - } - }); - }); - - var form = document.getElementById('operatorReviewForm'); - form.addEventListener('submit', function (event) { - var oilAmountInput = document.getElementById('OilAmount'); - var oilAmount = parseFloat(oilAmountInput.value) || 0; - var fuelTankCapacity = parseFloat('@ViewBag.FuelTankCapacity') || fuelTankCapacitys; - var remainingFuel = parseFloat('@ViewBag.RemainingFuel') || remainingFuels; - var checkbox = document.getElementById('flexSwitchCheckDefault'); - - if (checkbox.checked && (remainingFuel + oilAmount) > fuelTankCapacity) { - var errorMessage = `Diqqat: Umumiy yoqilg'i miqdori bak sig'imidan oshib ketmoqda! Yoqilgi 0 va ${fuelTankCapacity - remainingFuel} bolishi kerak`; - - oilAmountInput.classList.add('is-invalid'); - event.preventDefault(); - - document.getElementById('validationErrorMessage').textContent = errorMessage; - $('#validationErrorModal').modal('show'); - } else if (!checkbox.checked && oilAmount > 0) { - var errorMessage = `Diqqat: Yoqilgi berdingiz ammo quydim tugmasini berishni unutdingiz!`; - - oilAmountInput.classList.add('is-invalid'); - event.preventDefault(); - - document.getElementById('validationErrorMessage').textContent = errorMessage; - $('#validationErrorModal').modal('show') - } - }); - - }, - error: function () { - alert("Ro'yhatga olish formani yuklashda xatolik yuz berdi."); - } - }); - }); - }); - $('#createOperatorReviewModal').on('hidden.bs.modal', function () { - $(this).find('#modalContent').empty(); // Modal yopilganda ichki kontentni tozalash - }); - - -</script> - -<script> - // Default selected year and month - let selectedYear = new Date().getFullYear(); // Current year - let selectedMonth = new Date().getMonth() + 1; // Current month (months are zero-based) - - // Function to handle the change event in the calendar - function valueChange(args) { - var selectedDate = args.value; - selectedYear = selectedDate.getFullYear(); - selectedMonth = selectedDate.getMonth() + 1; // Months are zero-based - - // Optionally, update a label to display the selected date (if you have one) - document.getElementById('date_label').textContent = 'Выбранное значение: ' + selectedDate.toDateString(); - } - - // Prevent the dropdown from closing when clicking inside - document.getElementById('dropdownMenu').addEventListener('click', function (event) { - event.stopPropagation(); // Stops the dropdown from closing when interacting with its contents - }); - - // Handle the download button click - document.getElementById('downloadButton').addEventListener('click', function (e) { - e.preventDefault(); // Prevent the default action of the link - - // Construct the download URL using the selected year and month - const url = `/OperatorReviews/Download?year=${selectedYear}&month=${selectedMonth}`; - - // Create a temporary link to trigger the download - const link = document.createElement('a'); - link.href = url; - link.setAttribute('download', ''); // Add download attribute to force download - document.body.appendChild(link); - link.click(); - document.body.removeChild(link); // Clean up - - // Manually close the dropdown after downloading - const dropdown = bootstrap.Dropdown.getInstance(document.getElementById('dropdownMenuButton')); - dropdown.hide(); - }); -</script> - -<style> - .modal-lg { - max-width: 100%; - /* Ekranning 90% qismini egallaydi */ - } - - .modal-content { - width: 40%; /* Modal o'lchamini 80% qiling */ - max-width: 700px; /* Maksimal o'lcham */ - } - - .nav-tabs .nav-link.active { - background-color: #007bff; - color: white; - } - - .nav-tabs .nav-link { - border: 1px solid #dee2e6; - } - - .badge { - font-size: 0.8rem; - padding: 5px 10px; - border-radius: 5px; - } - - .bg-pending{ - background-color: orange; - } - - .bg-unassigned{ - background-color: slategray; - } - - .bg-success { - background-color: #28a745; - } - - .bg-danger { - background-color: #dc3545; - } - - .bg-empty { - background-color: gray; - } - - .shadow { - box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); - } - - .table { - width: 100%; - margin: 0 auto; - } - - .table th, .table td { - vertical-align: middle !important; - } - - .container { - margin-top: 30px; - } - - .table-bordered { - border: 1px solid #dee2e6; - } - - .table-bordered th, .table-bordered td { - border: 1px solid #dee2e6; - } - - .pagination { - justify-content: flex-end; - } - - .shadow { - box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); - } - - .text-center { - text-align: center !important; - } - - .text-end { - text-align: end !important; - } - - .mb-3 { - margin-bottom: 1rem !important; - } - - .mt-5 { - margin-top: 3rem !important; - } - - .comments-column { - max-width: 250px; - word-wrap: break-word; - white-space: normal; - } -</style> diff --git a/CheckDrive.Web/CheckDrive.Web/Views/OperatorReviews/ReportIndexForPersonalPage.cshtml b/CheckDrive.Web/CheckDrive.Web/Views/OperatorReviews/ReportIndexForPersonalPage.cshtml deleted file mode 100644 index 28356f10..00000000 --- a/CheckDrive.Web/CheckDrive.Web/Views/OperatorReviews/ReportIndexForPersonalPage.cshtml +++ /dev/null @@ -1,54 +0,0 @@ -@{ - ViewData["Title"] = "ReportIndexForPersonalPage"; - Layout = "~/Views/Shared/_PersonalLayout.cshtml"; -} -<div class="container mt-5"> - <div class="col-md-12"> - <div class="widget chart" style="width: 100%; margin-right: 100px;"> - <div class="p-4"> - <h5 class="fw-bold">Yoqilg'i sarfi</h5> - </div> - <ejs-chart id="spline-chart" background="whitesmoke" - palettes=@(new string[]{"#54ffa9","#ffe91a","#4287f5","#8a442c","#b603fc"})> - <e-chart-primaryxaxis valueType="Category"> - <e-majorgridlines width="0"></e-majorgridlines> - <e-majorticklines width="0"></e-majorticklines> - </e-chart-primaryxaxis> - <e-chart-primaryyaxis> - <e-majorgridlines width="1" color="#32414d" dashArray="3,5"></e-majorgridlines> - <e-majorticklines width="0"></e-majorticklines> - <e-linestyle width="0"></e-linestyle> - </e-chart-primaryyaxis> - <e-chart-chartarea> - <e-chartarea-border width="1"></e-chartarea-border> - </e-chart-chartarea> - <e-series-collection> - <e-series dataSource="@ViewBag.SplineChartData" xName="Month" width="3" - yName="Ai80" name="Ai80" type="Spline"></e-series> - <e-series dataSource="@ViewBag.SplineChartData" xName="Month" width="3" - yName="Ai91" name="Ai91" type="Spline"></e-series> - <e-series dataSource="@ViewBag.SplineChartData" xName="Month" width="3" - yName="Ai92" name="Ai92" type="Spline"></e-series> - <e-series dataSource="@ViewBag.SplineChartData" xName="Month" width="3" - yName="Ai95" name="Ai95" type="Spline"></e-series> - <e-series dataSource="@ViewBag.SplineChartData" xName="Month" width="3" - yName="Diesel" name="Diesel" type="Spline"></e-series> - </e-series-collection> - <e-chart-legendsettings position="Top" alignment="Far" toggleVisibility="false"> - <e-legendsettings-textstyle color="#0f0f0f" size="1rem"></e-legendsettings-textstyle> - </e-chart-legendsettings> - <e-chart-tooltipsettings enable shared></e-chart-tooltipsettings> - </ejs-chart> - </div> - </div> -</div> -<style> - .nav-tabs .nav-link.active { - background-color: #007bff; - color: white; - } - - .nav-tabs .nav-link { - border: 1px solid #dee2e6; - } -</style> \ No newline at end of file diff --git a/CheckDrive.Web/CheckDrive.Web/Views/Home/Index.cshtml b/CheckDrive.Web/CheckDrive.Web/Views/Shared/Index.cshtml similarity index 86% rename from CheckDrive.Web/CheckDrive.Web/Views/Home/Index.cshtml rename to CheckDrive.Web/CheckDrive.Web/Views/Shared/Index.cshtml index 2e0910b0..de1b0e3f 100644 --- a/CheckDrive.Web/CheckDrive.Web/Views/Home/Index.cshtml +++ b/CheckDrive.Web/CheckDrive.Web/Views/Shared/Index.cshtml @@ -2,6 +2,11 @@ @{ ViewData["Title"] = "Asosiy"; + Layout = "~/Views/Shared/_Layout.cshtml"; +} + +@section Scripts{ + <script src="~/js/checkPoint.js"></script> } <div class="row mb-4"> @@ -115,24 +120,36 @@ allowSorting="true" dataSource="@Model.CheckPointSummaries" gridLines="Both"> - <e-grid-pagesettings pageSize="15"></e-grid-pagesettings> + <e-grid-pagesettings pageSize="10"></e-grid-pagesettings> <e-grid-columns> - <e-grid-column headerText="Id" field="Id" template="#navigationColumnTemplate" textAlign=Center headerTextAlign=Center width="20"></e-grid-column> - <e-grid-column headerText="Boshlangan vaqt" field="StartDate" textAlign=Center headerTextAlign=Center width="100"></e-grid-column> <e-grid-column headerText="Haydovchi" field="DriverName" textAlign=Center headerTextAlign=Center width="100"></e-grid-column> <e-grid-column headerText="Mashina" field="Car" textAlign=Center headerTextAlign=Center width="80"></e-grid-column> + <e-grid-column headerText="Boshlangan vaqt" field="StartDate" format="dd/MM/yyyy hh:mm" textAlign=Center headerTextAlign=Center width="100"></e-grid-column> <e-grid-column headerText="Bosqich" template="#stageColumnTemplate" textAlign=Center headerTextAlign=Center width="100"></e-grid-column> - <e-grid-column headerText="Status" field="Status" template="#statusColumnTemplate" textAlign=Center headerTextAlign=Center width="130"></e-grid-column> + <e-grid-column headerText="Status" field="Status" template="#statusColumnTemplate" textAlign=Center headerTextAlign=Center width="90"></e-grid-column> + <e-grid-column template="#navigationColumnTemplate" textAlign=Center width="40"></e-grid-column> </e-grid-columns> </ejs-grid> </div> </div> </div> -<script id="navigationColumnTemplate" type="text/x-template"> - <div> - <a rel="nofollow" href="checkpoint/index/${Id}">${Id}</a> +<div class="modal fade" id="detailsModal" tabindex="-1" role="dialog" > + <div class="modal-dialog modal-xl modal-dialog-centered"> + <div class="modal-content"> + <div class="modal-header d-flex justify-content-center"> + <button type="button" class="btn-close" data-bs-dismiss="modal" ></button> + </div> + <div class="modal-body" id="detailsContent"> + </div> + </div> </div> +</div> + +<script id="navigationColumnTemplate" type="text/x-template"> + <button type="button" class="shadow-sm bg-white rounded e-btn e-flat mx-2" title="Tafsilot" onclick="onDetailsClick(${Id})"> + <i class="bi bi-card-list text-info" style="font-size: 19px;"></i> + </button> </script> <script id="stageColumnTemplate" type="text/x-template"> @@ -161,4 +178,4 @@ ${else if(Status == 3)} <span class="badge bg-danger">Uzilgan</span> ${/if} -</script> +</script> \ No newline at end of file diff --git a/CheckDrive.Web/CheckDrive.Web/Views/Shared/_SideBar.cshtml b/CheckDrive.Web/CheckDrive.Web/Views/Shared/_Sidebar.cshtml similarity index 57% rename from CheckDrive.Web/CheckDrive.Web/Views/Shared/_SideBar.cshtml rename to CheckDrive.Web/CheckDrive.Web/Views/Shared/_Sidebar.cshtml index 4a972136..fcd95938 100644 --- a/CheckDrive.Web/CheckDrive.Web/Views/Shared/_SideBar.cshtml +++ b/CheckDrive.Web/CheckDrive.Web/Views/Shared/_Sidebar.cshtml @@ -1,12 +1,8 @@ -@using CheckDrive.Web.Stores.Menu; -@using CheckDrive.Web.Stores.User -@using CheckDrive.Web.Services.CurrentUserService; -@inject ICurrentUserService currentUserService; +@using CheckDrive.Web.Stores.Menu; @inject IMenuService menuService; @{ - var role = currentUserService.GetRole(); - var menuItems = menuService.GetMenuItems(role); + var menuItems = menuService.GetMenuItems(); } <ejs-sidebar id="sidebar" width="290px" enableDock dockSize="100px" @@ -14,9 +10,9 @@ <e-content-template> <div class="app-logo logo-wrapper mb-5"> - <img src='~/Images/LogoCheakDrive.png' /> + <img src='~/Images/logo.png' /> </div> - + <ejs-menu id="menu" items="menuItems" orientation="Vertical" diff --git a/CheckDrive.Web/CheckDrive.Web/wwwroot/css/checkPoint.css b/CheckDrive.Web/CheckDrive.Web/wwwroot/css/checkPoint.css new file mode 100644 index 00000000..a76e53b8 --- /dev/null +++ b/CheckDrive.Web/CheckDrive.Web/wwwroot/css/checkPoint.css @@ -0,0 +1,30 @@ +.row.value { + border-bottom: 1px solid #ddd; +} + +.save-button { + background-color: #28a745; + color: white; + font-size: 16px; + font-weight: bold; + border: none; + border-radius: 8px; + padding: 10px 20px; + width: 250px; + margin-top: 25px; + transition: background-color 0.3s ease, transform 0.2s ease; + box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); + text-align: center; +} + + .save-button:hover { + background-color: #218838; + transform: translateY(-2px); + box-shadow: 0 6px 10px rgba(0, 0, 0, 0.15); + } + + .save-button:active { + background-color: #1e7e34; + transform: translateY(0); + box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); + } diff --git a/CheckDrive.Web/CheckDrive.Web/wwwroot/css/employees.css b/CheckDrive.Web/CheckDrive.Web/wwwroot/css/employees.css index b07af332..389c6b5d 100644 --- a/CheckDrive.Web/CheckDrive.Web/wwwroot/css/employees.css +++ b/CheckDrive.Web/CheckDrive.Web/wwwroot/css/employees.css @@ -21,6 +21,6 @@ button { display: none; } -.e-pager .e-pagerexternalmsg { - display: none; -} +.e-pagerexternalmsg { + display: none +} \ No newline at end of file diff --git a/CheckDrive.Web/CheckDrive.Web/wwwroot/js/checkPoint.js b/CheckDrive.Web/CheckDrive.Web/wwwroot/js/checkPoint.js new file mode 100644 index 00000000..d0d4105d --- /dev/null +++ b/CheckDrive.Web/CheckDrive.Web/wwwroot/js/checkPoint.js @@ -0,0 +1,20 @@ +function onDetailsClick(id) { + $('#detailsContent').empty(); + + $.ajax({ + url: `/checkPoint/details/${id}`, + type: 'GET', + contentType: 'application/x-www-form-urlencoded; charset=UTF-8', + success: function (data) { + $('#detailsContent').html(data); + var detailsModal = new bootstrap.Modal(document.getElementById('detailsModal'), { + backdrop: 'static', + keyboard: false + }); + detailsModal.show(); + }, + error: function (error) { + alert("Ma'lumotlarni yuklashda muammo yuz berdi."); + } + }); +} \ No newline at end of file diff --git a/CheckDrive.Web/CheckDrive.Web/wwwroot/js/oilMark.js b/CheckDrive.Web/CheckDrive.Web/wwwroot/js/oilMark.js new file mode 100644 index 00000000..196cffac --- /dev/null +++ b/CheckDrive.Web/CheckDrive.Web/wwwroot/js/oilMark.js @@ -0,0 +1,73 @@ +$(document).ready(function () { + $('#openOilCreateModal').on('click', function () { + console.log(346); + $('#oilModalContent').empty(); + $.ajax({ + url: '/oilmarks/create', + type: 'GET', + contentType: 'application/x-www-form-urlencoded; charset=UTF-8', + headers: { + 'RequestVerificationToken': $('input[name="__RequestVerificationToken"]').val() + }, + success: function (data) { + console.log(data); + $('#oilModalContent').html(data); + $.getScript('/lib/jquery-validation/dist/jquery.validate.min.js', function () { + $.getScript('/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js'); + }); + var modal = new bootstrap.Modal(document.getElementById('createOilModal'), { + backdrop: 'static', + keyboard: false + }); + modal.show(); + }, + + error: function (error) { + alert("Yaratish oynasini chiqarishda muommo buldi."); + } + }); + }); +}); + +$('#createOilModal').on('hidden.bs.modal', function () { + $(this).find('#oilModalContent').empty(); + $(this).off('hidden.bs.modal'); +}); + +function onEditClick(id) { + $('#oilEditModalContent').empty(); + $.ajax({ + url: "/oilmarks/edit/" + id, + type: 'GET', + success: function (data) { + $('#oilEditModalContent').html(data); + $('#oilEditModal').modal({ + backdrop: 'static', + keyboard: false + }).modal('show'); + }, + error: function (error) { + alert("Tahrirlash oynasini ochishda muommo bo'ldi \n" + error); + } + }); + $(this).find('#oilEditModalContent').empty(); + $(this).off('hidden.bs.modal'); +} + +function onDeleteClick(id) { + $('#deleteOilContent').empty(); + $.ajax({ + url: "/oilmarks/delete/" + id, + type: 'GET', + success: function (data) { + $('#deleteOilContent').html(data); + $('#deleteOilModal').modal('show'); + }, + error: function () { + $('#deleteOilContent').html('<p>Error loading details</p>'); + } + }); + + $(this).find('#deleteOilContent').empty(); + $(this).off('hidden.bs.modal'); +}