mirror of
https://github.com/Prominence/car-repair-site.git
synced 2026-01-10 04:06:43 +03:00
Added CRUD for 'Mechanic' entity. Added translations.
This commit is contained in:
parent
b541e69885
commit
0124899525
@ -17,3 +17,6 @@ public class CarRepairApplication {
|
|||||||
}
|
}
|
||||||
// TODO: logging
|
// TODO: logging
|
||||||
// TODO: DTO
|
// TODO: DTO
|
||||||
|
// TODO: i18n
|
||||||
|
// TODO: tests
|
||||||
|
// TODO: big data
|
||||||
@ -0,0 +1,98 @@
|
|||||||
|
package com.github.prominence.carrepair.controller;
|
||||||
|
|
||||||
|
import com.github.prominence.carrepair.enums.OrderStatus;
|
||||||
|
import com.github.prominence.carrepair.model.Mechanic;
|
||||||
|
import com.github.prominence.carrepair.service.MechanicService;
|
||||||
|
import org.springframework.data.domain.Page;
|
||||||
|
import org.springframework.data.domain.Pageable;
|
||||||
|
import org.springframework.http.ResponseEntity;
|
||||||
|
import org.springframework.stereotype.Controller;
|
||||||
|
import org.springframework.ui.Model;
|
||||||
|
import org.springframework.ui.ModelMap;
|
||||||
|
import org.springframework.validation.BindingResult;
|
||||||
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
|
||||||
|
import javax.validation.Valid;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
@Controller
|
||||||
|
@RequestMapping("/mechanic")
|
||||||
|
public class MechanicController {
|
||||||
|
|
||||||
|
private MechanicService mechanicService;
|
||||||
|
|
||||||
|
public MechanicController(MechanicService mechanicService) {
|
||||||
|
this.mechanicService = mechanicService;
|
||||||
|
}
|
||||||
|
|
||||||
|
@GetMapping
|
||||||
|
public String index(ModelMap modelMap) {
|
||||||
|
Page<Mechanic> clientList = mechanicService.findAll((Pageable) modelMap.get("pagination"));
|
||||||
|
|
||||||
|
modelMap.addAttribute("mechanicList", clientList.getContent());
|
||||||
|
modelMap.addAttribute("totalPages", clientList.getTotalPages());
|
||||||
|
|
||||||
|
return "mechanic/index";
|
||||||
|
}
|
||||||
|
|
||||||
|
@GetMapping(value = "/create")
|
||||||
|
public String create(Model model) {
|
||||||
|
model.addAttribute("mechanic", new Mechanic());
|
||||||
|
|
||||||
|
return "mechanic/edit";
|
||||||
|
}
|
||||||
|
|
||||||
|
@GetMapping(value = "/edit/{id}")
|
||||||
|
public String edit(@PathVariable Long id, Model model) {
|
||||||
|
Optional<Mechanic> clientOptional = mechanicService.findById(id);
|
||||||
|
if (clientOptional.isPresent()) {
|
||||||
|
model.addAttribute("mechanic", clientOptional.get());
|
||||||
|
return "mechanic/edit";
|
||||||
|
} else {
|
||||||
|
// TODO: need to show warning
|
||||||
|
return "redirect:/mechanic";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@PostMapping(value = "/update/{id}")
|
||||||
|
public String update(@Valid Mechanic client, BindingResult bindingResult, @PathVariable long id) {
|
||||||
|
if (bindingResult.hasErrors()) {
|
||||||
|
client.setId(id); // why should we do this?
|
||||||
|
return "mechanic/edit";
|
||||||
|
}
|
||||||
|
|
||||||
|
mechanicService.save(client);
|
||||||
|
return "redirect:/mechanic";
|
||||||
|
}
|
||||||
|
|
||||||
|
@PostMapping(value = "/create")
|
||||||
|
public String save(@Valid Mechanic client, BindingResult bindingResult) {
|
||||||
|
if (bindingResult.hasErrors()) {
|
||||||
|
return "mechanic/edit";
|
||||||
|
}
|
||||||
|
|
||||||
|
mechanicService.save(client);
|
||||||
|
return "redirect:/mechanic";
|
||||||
|
}
|
||||||
|
|
||||||
|
@DeleteMapping(value = "/delete/{id}")
|
||||||
|
public ResponseEntity delete(@PathVariable Long id) {
|
||||||
|
boolean deleteSuccess = mechanicService.deleteMechanicById(id);
|
||||||
|
|
||||||
|
if (deleteSuccess) {
|
||||||
|
return ResponseEntity.ok().build();
|
||||||
|
} else {
|
||||||
|
return ResponseEntity.notFound().build();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@GetMapping(value = "/statistics/{id}")
|
||||||
|
public String statistics(@PathVariable Long id, Model model) {
|
||||||
|
Map<OrderStatus, Integer> mechanicStatistics = mechanicService.getOrderStatistics(id);
|
||||||
|
model.addAttribute("statistics", mechanicStatistics);
|
||||||
|
|
||||||
|
return "mechanic/statistics";
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -2,11 +2,14 @@ package com.github.prominence.carrepair.demo;
|
|||||||
|
|
||||||
import com.github.javafaker.Faker;
|
import com.github.javafaker.Faker;
|
||||||
import com.github.prominence.carrepair.model.Client;
|
import com.github.prominence.carrepair.model.Client;
|
||||||
import com.github.prominence.carrepair.repository.ClientRepository;
|
import com.github.prominence.carrepair.model.Mechanic;
|
||||||
|
import com.github.prominence.carrepair.service.ClientService;
|
||||||
|
import com.github.prominence.carrepair.service.MechanicService;
|
||||||
import org.springframework.boot.CommandLineRunner;
|
import org.springframework.boot.CommandLineRunner;
|
||||||
import org.springframework.context.annotation.Bean;
|
import org.springframework.context.annotation.Bean;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import java.math.BigDecimal;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
import java.util.stream.Stream;
|
import java.util.stream.Stream;
|
||||||
@ -15,10 +18,10 @@ import java.util.stream.Stream;
|
|||||||
public class DemoDataPopulator {
|
public class DemoDataPopulator {
|
||||||
private static final int COUNT = 10;
|
private static final int COUNT = 10;
|
||||||
|
|
||||||
@Bean
|
private Faker faker = new Faker();
|
||||||
public CommandLineRunner demoData(ClientRepository clientRepository) {
|
|
||||||
Faker faker = new Faker();
|
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public CommandLineRunner clientDemoData(ClientService clientService) {
|
||||||
List<Client> demoClientList = Stream.generate(() -> {
|
List<Client> demoClientList = Stream.generate(() -> {
|
||||||
Client client = new Client();
|
Client client = new Client();
|
||||||
client.setFirstName(faker.name().firstName());
|
client.setFirstName(faker.name().firstName());
|
||||||
@ -30,7 +33,24 @@ public class DemoDataPopulator {
|
|||||||
}).limit(COUNT).collect(Collectors.toList());
|
}).limit(COUNT).collect(Collectors.toList());
|
||||||
|
|
||||||
return args -> {
|
return args -> {
|
||||||
demoClientList.forEach(clientRepository::save);
|
demoClientList.forEach(clientService::save);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public CommandLineRunner mechanicDemoData(MechanicService mechanicService) {
|
||||||
|
List<Mechanic> demoMechanicList = Stream.generate(() -> {
|
||||||
|
Mechanic mechanic = new Mechanic();
|
||||||
|
mechanic.setFirstName(faker.name().firstName());
|
||||||
|
mechanic.setLastName(faker.name().lastName());
|
||||||
|
mechanic.setMiddleName(faker.name().username());
|
||||||
|
mechanic.setHourlyPayment(BigDecimal.valueOf(faker.number().randomDouble(3, 100, 999)));
|
||||||
|
System.out.println(mechanic); // demo output
|
||||||
|
return mechanic;
|
||||||
|
}).limit(COUNT).collect(Collectors.toList());
|
||||||
|
|
||||||
|
return args -> {
|
||||||
|
demoMechanicList.forEach(mechanicService::save);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -3,14 +3,17 @@ package com.github.prominence.carrepair.model;
|
|||||||
import javax.persistence.Column;
|
import javax.persistence.Column;
|
||||||
import javax.persistence.Entity;
|
import javax.persistence.Entity;
|
||||||
import javax.persistence.Table;
|
import javax.persistence.Table;
|
||||||
|
import javax.validation.constraints.Min;
|
||||||
import javax.validation.constraints.NotNull;
|
import javax.validation.constraints.NotNull;
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
@Entity
|
@Entity
|
||||||
@Table(name = "mechanic")
|
@Table(name = "mechanic")
|
||||||
public class Mechanic extends Person {
|
public class Mechanic extends Person {
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
|
@Min(value = 0)
|
||||||
@Column(name = "hourlyPayment")
|
@Column(name = "hourlyPayment")
|
||||||
private BigDecimal hourlyPayment;
|
private BigDecimal hourlyPayment;
|
||||||
|
|
||||||
@ -29,4 +32,29 @@ public class Mechanic extends Person {
|
|||||||
public void setHourlyPayment(BigDecimal hourlyPayment) {
|
public void setHourlyPayment(BigDecimal hourlyPayment) {
|
||||||
this.hourlyPayment = hourlyPayment;
|
this.hourlyPayment = hourlyPayment;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object o) {
|
||||||
|
if (this == o) return true;
|
||||||
|
if (!(o instanceof Mechanic)) return false;
|
||||||
|
if (!super.equals(o)) return false;
|
||||||
|
Mechanic mechanic = (Mechanic) o;
|
||||||
|
return Objects.equals(hourlyPayment, mechanic.hourlyPayment);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
return Objects.hash(super.hashCode(), hourlyPayment);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return "Mechanic{" +
|
||||||
|
"hourlyPayment=" + hourlyPayment +
|
||||||
|
", id=" + id +
|
||||||
|
", firstName='" + firstName + '\'' +
|
||||||
|
", middleName='" + middleName + '\'' +
|
||||||
|
", lastName='" + lastName + '\'' +
|
||||||
|
'}';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -4,6 +4,10 @@ import com.github.prominence.carrepair.model.Order;
|
|||||||
import org.springframework.data.jpa.repository.JpaRepository;
|
import org.springframework.data.jpa.repository.JpaRepository;
|
||||||
import org.springframework.stereotype.Repository;
|
import org.springframework.stereotype.Repository;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
@Repository
|
@Repository
|
||||||
public interface OrderRepository extends JpaRepository<Order, Long> {
|
public interface OrderRepository extends JpaRepository<Order, Long> {
|
||||||
|
|
||||||
|
public List<Order> findAllByMechanic_Id(Long id);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -0,0 +1,61 @@
|
|||||||
|
package com.github.prominence.carrepair.service;
|
||||||
|
|
||||||
|
import com.github.prominence.carrepair.enums.OrderStatus;
|
||||||
|
import com.github.prominence.carrepair.model.Mechanic;
|
||||||
|
import com.github.prominence.carrepair.model.Order;
|
||||||
|
import com.github.prominence.carrepair.repository.MechanicRepository;
|
||||||
|
import com.github.prominence.carrepair.repository.OrderRepository;
|
||||||
|
import org.springframework.data.domain.Page;
|
||||||
|
import org.springframework.data.domain.Pageable;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
public class MechanicService {
|
||||||
|
|
||||||
|
private MechanicRepository mechanicRepository;
|
||||||
|
private OrderRepository orderRepository;
|
||||||
|
|
||||||
|
public MechanicService(MechanicRepository mechanicRepository, OrderRepository orderRepository) {
|
||||||
|
this.mechanicRepository = mechanicRepository;
|
||||||
|
this.orderRepository = orderRepository;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Page<Mechanic> findAll(Pageable pageable) {
|
||||||
|
return mechanicRepository.findAll(pageable);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Optional<Mechanic> findById(Long id) {
|
||||||
|
return mechanicRepository.findById(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Mechanic save(Mechanic client) {
|
||||||
|
return mechanicRepository.save(client);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean deleteMechanicById(Long id) {
|
||||||
|
try {
|
||||||
|
mechanicRepository.deleteById(id);
|
||||||
|
return true;
|
||||||
|
} catch (Exception e) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public Map<OrderStatus, Integer> getOrderStatistics(Long mechanicId) {
|
||||||
|
Map<OrderStatus, Integer> statistics = new HashMap<>();
|
||||||
|
statistics.put(OrderStatus.SCHEDULED, 0);
|
||||||
|
statistics.put(OrderStatus.ACCEPTED, 0);
|
||||||
|
statistics.put(OrderStatus.DONE, 0);
|
||||||
|
|
||||||
|
List<Order> mechanicOrders = orderRepository.findAllByMechanic_Id(mechanicId);
|
||||||
|
|
||||||
|
mechanicOrders.forEach(order -> statistics.merge(order.getOrderStatus(), 1, Integer::sum));
|
||||||
|
|
||||||
|
return statistics;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -7,3 +7,24 @@ badge.orders = Orders
|
|||||||
home.requirements.label = Requirements
|
home.requirements.label = Requirements
|
||||||
|
|
||||||
client.title = Clients
|
client.title = Clients
|
||||||
|
mechanic.title = Mechanics
|
||||||
|
|
||||||
|
firstName.label = First Name
|
||||||
|
middleName.label = Middle Name
|
||||||
|
lastName.label = Last Name
|
||||||
|
phoneNo.label = Phone No
|
||||||
|
hourlyPayment.label = Hourly Payment
|
||||||
|
status.label = Status
|
||||||
|
amount.label = Amount
|
||||||
|
|
||||||
|
showStatistics.button = Statistics
|
||||||
|
|
||||||
|
status.scheduled.label = Scheduled
|
||||||
|
status.done.label = Done
|
||||||
|
status.accepted.label = Accepted by client
|
||||||
|
|
||||||
|
common.create.button = Create
|
||||||
|
common.delete.button = Delete
|
||||||
|
common.save.button = Save
|
||||||
|
common.edit.button = Edit
|
||||||
|
common.back.button = Back
|
||||||
|
|||||||
@ -7,3 +7,24 @@ badge.orders = Orders
|
|||||||
home.requirements.label = Requirements
|
home.requirements.label = Requirements
|
||||||
|
|
||||||
client.title = Clients
|
client.title = Clients
|
||||||
|
mechanic.title = Mechanics
|
||||||
|
|
||||||
|
firstName.label = First Name
|
||||||
|
middleName.label = Middle Name
|
||||||
|
lastName.label = Last Name
|
||||||
|
phoneNo.label = Phone No
|
||||||
|
hourlyPayment.label = Hourly Payment
|
||||||
|
status.label = Status
|
||||||
|
amount.label = Amount
|
||||||
|
|
||||||
|
showStatistics.button = Statistics
|
||||||
|
|
||||||
|
status.scheduled.label = Scheduled
|
||||||
|
status.done.label = Done
|
||||||
|
status.accepted.label = Accepted by client
|
||||||
|
|
||||||
|
common.create.button = Create
|
||||||
|
common.delete.button = Delete
|
||||||
|
common.save.button = Save
|
||||||
|
common.edit.button = Edit
|
||||||
|
common.back.button = Back
|
||||||
|
|||||||
@ -7,3 +7,24 @@ badge.orders = Заказы
|
|||||||
home.requirements.label = Требования
|
home.requirements.label = Требования
|
||||||
|
|
||||||
client.title = Клиенты
|
client.title = Клиенты
|
||||||
|
mechanic.title = Механики
|
||||||
|
|
||||||
|
firstName.label = Имя
|
||||||
|
middleName.label = Отчество
|
||||||
|
lastName.label = Фамилия
|
||||||
|
phoneNo.label = Номер телефона
|
||||||
|
hourlyPayment.label = Почасовая оплата
|
||||||
|
status.label = Статус
|
||||||
|
amount.label = Количество
|
||||||
|
|
||||||
|
showStatistics.button = Статистика
|
||||||
|
|
||||||
|
status.scheduled.label = Запланировано
|
||||||
|
status.done.label = Выполнено
|
||||||
|
status.accepted.label = Принято клиентом
|
||||||
|
|
||||||
|
common.create.button = Создать
|
||||||
|
common.delete.button = Удалить
|
||||||
|
common.save.button = Сохранить
|
||||||
|
common.edit.button = Редактировать
|
||||||
|
common.back.button = Назад
|
||||||
|
|||||||
@ -10,28 +10,28 @@
|
|||||||
|
|
||||||
<form th:action="'/client/' + ${client.id != null ? 'update/' + client.id : 'create'}" th:object="${client}" method="post">
|
<form th:action="'/client/' + ${client.id != null ? 'update/' + client.id : 'create'}" th:object="${client}" method="post">
|
||||||
<div class="form-group row">
|
<div class="form-group row">
|
||||||
<label for="clientFirstName" class="col-sm-2 col-form-label">First Name</label>
|
<label for="clientFirstName" class="col-sm-2 col-form-label" th:text="#{firstName.label}"></label>
|
||||||
<div class="col-sm-10">
|
<div class="col-sm-10">
|
||||||
<input type="text" name="firstName" class="form-control" id="clientFirstName" th:field="*{firstName}" th:errorclass="fieldError" th:value="${client.firstName}">
|
<input type="text" name="firstName" class="form-control" id="clientFirstName" th:field="*{firstName}" th:errorclass="fieldError" th:value="${client.firstName}">
|
||||||
<div th:replace="common::errors('firstName')"></div>
|
<div th:replace="common::errors('firstName')"></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group row">
|
<div class="form-group row">
|
||||||
<label for="clientMiddleName" class="col-sm-2 col-form-label">Middle Name</label>
|
<label for="clientMiddleName" class="col-sm-2 col-form-label" th:text="#{middleName.label}"></label>
|
||||||
<div class="col-sm-10">
|
<div class="col-sm-10">
|
||||||
<input type="text" name="middleName" class="form-control" id="clientMiddleName" th:field="*{middleName}" th:errorclass="fieldError" th:value="${client.middleName}">
|
<input type="text" name="middleName" class="form-control" id="clientMiddleName" th:field="*{middleName}" th:errorclass="fieldError" th:value="${client.middleName}">
|
||||||
<div th:replace="common::errors('middleName')"></div>
|
<div th:replace="common::errors('middleName')"></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group row">
|
<div class="form-group row">
|
||||||
<label for="clientLastName" class="col-sm-2 col-form-label">Last Name</label>
|
<label for="clientLastName" class="col-sm-2 col-form-label" th:text="#{lastName.label}"></label>
|
||||||
<div class="col-sm-10">
|
<div class="col-sm-10">
|
||||||
<input type="text" name="lastName" class="form-control" id="clientLastName" th:field="*{lastName}" th:errorclass="fieldError" th:value="${client.lastName}">
|
<input type="text" name="lastName" class="form-control" id="clientLastName" th:field="*{lastName}" th:errorclass="fieldError" th:value="${client.lastName}">
|
||||||
<div th:replace="common::errors('lastName')"></div>
|
<div th:replace="common::errors('lastName')"></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group row">
|
<div class="form-group row">
|
||||||
<label for="clientPhoneNo" class="col-sm-2 col-form-label">Phone No</label>
|
<label for="clientPhoneNo" class="col-sm-2 col-form-label" th:text="#{phoneNo.label}"></label>
|
||||||
<div class="col-sm-10">
|
<div class="col-sm-10">
|
||||||
<input type="text" name="phoneNo" class="form-control" id="clientPhoneNo" th:field="*{phoneNo}" th:errorclass="fieldError" th:value="${client.phoneNo}">
|
<input type="text" name="phoneNo" class="form-control" id="clientPhoneNo" th:field="*{phoneNo}" th:errorclass="fieldError" th:value="${client.phoneNo}">
|
||||||
<div th:replace="common::errors('phoneNo')"></div>
|
<div th:replace="common::errors('phoneNo')"></div>
|
||||||
@ -39,8 +39,8 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="form-group row pull-right">
|
<div class="form-group row pull-right">
|
||||||
<div class="col-sm-12">
|
<div class="col-sm-12">
|
||||||
<a href="/client" class="btn btn-default">Back</a>
|
<a href="/client" class="btn btn-default" th:text="#{common.back.button}"></a>
|
||||||
<button type="submit" class="btn btn-primary">Save</button>
|
<button type="submit" class="btn btn-primary" th:text="#{common.save.button}"></button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
|
|||||||
@ -26,16 +26,16 @@
|
|||||||
<h1 th:text="#{client.title}"></h1>
|
<h1 th:text="#{client.title}"></h1>
|
||||||
|
|
||||||
<div class="pull-right">
|
<div class="pull-right">
|
||||||
<a class="btn btn-success" th:href="@{/client/create}">Create</a>
|
<a class="btn btn-success" th:href="@{/client/create}" th:text="#{common.create.button}"></a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<table class="table table-striped table-hover">
|
<table class="table table-striped table-hover">
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<th>First Name</th>
|
<th th:text="#{firstName.label}"></th>
|
||||||
<th>Middle Name</th>
|
<th th:text="#{middleName.label}"></th>
|
||||||
<th>Last Name</th>
|
<th th:text="#{lastName.label}"></th>
|
||||||
<th>Phone No</th>
|
<th th:text="#{phoneNo.label}"></th>
|
||||||
<th> </th>
|
<th> </th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
@ -47,8 +47,8 @@
|
|||||||
<td th:text="${client.phoneNo}"></td>
|
<td th:text="${client.phoneNo}"></td>
|
||||||
<td>
|
<td>
|
||||||
<div class="btn-group pull-right">
|
<div class="btn-group pull-right">
|
||||||
<a th:href="@{/client/edit/{id}(id=${client.id})}" class="btn btn-default">Edit</a>
|
<a th:href="@{/client/edit/{id}(id=${client.id})}" class="btn btn-default" th:text="#{common.edit.button}"></a>
|
||||||
<button type="button" class="btn btn-danger" th:onclick="'deleteClientById(' + ${client.id} + ')'">Delete</button>
|
<button type="button" class="btn btn-danger" th:onclick="'deleteClientById(' + ${client.id} + ')'" th:text="#{common.delete.button}"></button>
|
||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
|||||||
@ -20,7 +20,7 @@
|
|||||||
<div id="navbar" class="collapse navbar-collapse">
|
<div id="navbar" class="collapse navbar-collapse">
|
||||||
<ul class="nav navbar-nav">
|
<ul class="nav navbar-nav">
|
||||||
<li><a th:href="@{/client/}"><th:block th:text="#{badge.clients}"/> <span class="badge" th:text="${clientsCount}"></span></a></li>
|
<li><a th:href="@{/client/}"><th:block th:text="#{badge.clients}"/> <span class="badge" th:text="${clientsCount}"></span></a></li>
|
||||||
<li><a href="#"><th:block th:text="#{badge.mechanics}"/> <span class="badge" th:text="${mechanicsCount}"></span></a></li>
|
<li><a th:href="@{/mechanic/}"><th:block th:text="#{badge.mechanics}"/> <span class="badge" th:text="${mechanicsCount}"></span></a></li>
|
||||||
<li><a href="#"><th:block th:text="#{badge.orders}"/> <span class="badge" th:text="${ordersCount}"></span></a></li>
|
<li><a href="#"><th:block th:text="#{badge.orders}"/> <span class="badge" th:text="${ordersCount}"></span></a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
50
src/main/resources/templates/mechanic/edit.html
Normal file
50
src/main/resources/templates/mechanic/edit.html
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html lang="en" xmlns:th="http://www.thymeleaf.org" xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
|
||||||
|
layout:decorate="~{main}">
|
||||||
|
<head>
|
||||||
|
<title th:text="#{default.title}"></title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div layout:fragment="content">
|
||||||
|
<h1 th:text="#{mechanic.title}"></h1>
|
||||||
|
|
||||||
|
<form th:action="'/mechanic/' + ${mechanic.id != null ? 'update/' + mechanic.id : 'create'}" th:object="${mechanic}" method="post">
|
||||||
|
<div class="form-group row">
|
||||||
|
<label for="mechanicFirstName" class="col-sm-2 col-form-label" th:text="#{firstName.label}"></label>
|
||||||
|
<div class="col-sm-10">
|
||||||
|
<input type="text" name="firstName" class="form-control" id="mechanicFirstName" th:field="*{firstName}" th:errorclass="fieldError" th:value="${mechanic.firstName}">
|
||||||
|
<div th:replace="common::errors('firstName')"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group row">
|
||||||
|
<label for="mechanicMiddleName" class="col-sm-2 col-form-label" th:text="#{middleName.label}"></label>
|
||||||
|
<div class="col-sm-10">
|
||||||
|
<input type="text" name="middleName" class="form-control" id="mechanicMiddleName" th:field="*{middleName}" th:errorclass="fieldError" th:value="${mechanic.middleName}">
|
||||||
|
<div th:replace="common::errors('middleName')"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group row">
|
||||||
|
<label for="mechanicLastName" class="col-sm-2 col-form-label" th:text="#{lastName.label}"></label>
|
||||||
|
<div class="col-sm-10">
|
||||||
|
<input type="text" name="lastName" class="form-control" id="mechanicLastName" th:field="*{lastName}" th:errorclass="fieldError" th:value="${mechanic.lastName}">
|
||||||
|
<div th:replace="common::errors('lastName')"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group row">
|
||||||
|
<label for="mechanicHourlyPayment" class="col-sm-2 col-form-label" th:text="#{hourlyPayment.label}"></label>
|
||||||
|
<div class="col-sm-10">
|
||||||
|
<input type="number" name="phoneNo" class="form-control" id="mechanicHourlyPayment" th:field="*{hourlyPayment}" th:errorclass="fieldError" th:value="${mechanic.hourlyPayment}">
|
||||||
|
<div th:replace="common::errors('hourlyPayment')"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group row pull-right">
|
||||||
|
<div class="col-sm-12">
|
||||||
|
<a href="/mechanic" class="btn btn-default" th:text="#{common.back.button}"></a>
|
||||||
|
<button type="submit" class="btn btn-primary" th:text="#{common.save.button}"></button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
62
src/main/resources/templates/mechanic/index.html
Normal file
62
src/main/resources/templates/mechanic/index.html
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html lang="en" xmlns:th="http://www.thymeleaf.org" xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
|
||||||
|
layout:decorate="~{main}">
|
||||||
|
<head>
|
||||||
|
<title th:text="#{default.title}"></title>
|
||||||
|
|
||||||
|
<script th:inline="javascript">
|
||||||
|
function deleteMechanicById(id) {
|
||||||
|
const confirmationResult = confirm("Are you sure to delete?");
|
||||||
|
if (confirmationResult) {
|
||||||
|
const url = /*[[@{/mechanic/delete/}]]*/;
|
||||||
|
|
||||||
|
$.ajax({
|
||||||
|
url: url + id,
|
||||||
|
type: 'DELETE',
|
||||||
|
success: function () {
|
||||||
|
$('#mechanic-row-' + id).remove();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div layout:fragment="content">
|
||||||
|
<h1 th:text="#{mechanic.title}"></h1>
|
||||||
|
|
||||||
|
<div class="pull-right">
|
||||||
|
<a class="btn btn-success" th:href="@{/mechanic/create}" th:text="#{common.create.button}"></a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<table class="table table-striped table-hover">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th th:text="#{firstName.label}"></th>
|
||||||
|
<th th:text="#{middleName.label}"></th>
|
||||||
|
<th th:text="#{lastName.label}"></th>
|
||||||
|
<th th:text="#{hourlyPayment.label}"></th>
|
||||||
|
<th> </th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<tr th:each="mechanic : ${mechanicList}" th:id="'mechanic-row-' + ${mechanic.id}">
|
||||||
|
<td th:text="${mechanic.firstName}"></td>
|
||||||
|
<td th:text="${mechanic.middleName}"></td>
|
||||||
|
<td th:text="${mechanic.lastName}"></td>
|
||||||
|
<td th:text="${mechanic.hourlyPayment}"></td>
|
||||||
|
<td>
|
||||||
|
<div class="btn-group pull-right">
|
||||||
|
<a th:href="@{/mechanic/statistics/{id}(id=${mechanic.id})}" class="btn btn-info" th:text="#{showStatistics.button}"></a>
|
||||||
|
<a th:href="@{/mechanic/edit/{id}(id=${mechanic.id})}" class="btn btn-default" th:text="#{common.edit.button}"></a>
|
||||||
|
<button type="button" class="btn btn-danger" th:onclick="'deleteMechanicById(' + ${mechanic.id} + ')'" th:text="#{common.delete.button}"></button>
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
<div th:replace="common::pagination(@{/mechanic/}, ${page}, ${totalPages})"></div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
41
src/main/resources/templates/mechanic/statistics.html
Normal file
41
src/main/resources/templates/mechanic/statistics.html
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html lang="en" xmlns:th="http://www.thymeleaf.org" xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
|
||||||
|
layout:decorate="~{main}">
|
||||||
|
<head>
|
||||||
|
<title th:text="#{default.title}"></title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div layout:fragment="content">
|
||||||
|
<h1 th:text="#{mechanic.title}"></h1>
|
||||||
|
|
||||||
|
<table class="table table-striped table-hover">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th th:text="#{status.label}"></th>
|
||||||
|
<th th:text="#{amount.label}"></th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td th:text="#{status.scheduled.label}"></td>
|
||||||
|
<td th:text="${statistics.get(T(com.github.prominence.carrepair.enums.OrderStatus).SCHEDULED)}"></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td th:text="#{status.done.label}"></td>
|
||||||
|
<td th:text="${statistics.get(T(com.github.prominence.carrepair.enums.OrderStatus).DONE)}"></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td th:text="#{status.accepted.label}"></td>
|
||||||
|
<td th:text="${statistics.get(T(com.github.prominence.carrepair.enums.OrderStatus).ACCEPTED)}"></td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
<div class="form-group row pull-right">
|
||||||
|
<div class="col-sm-12">
|
||||||
|
<a href="/mechanic" class="btn btn-default" th:text="#{common.back.button}"></a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
Loading…
x
Reference in New Issue
Block a user