Skip to content

Commit

Permalink
♻️ : use vue components for module cards
Browse files Browse the repository at this point in the history
replacing thymeleaf templating
  • Loading branch information
juwit committed Aug 7, 2019
1 parent cbd193e commit fa13411
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 44 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -16,28 +16,21 @@
import java.util.Optional;

@Controller
public class TerraformModuleController {
public class ModulesMVCController {

private TerraformModuleRepository terraformModuleRepository;
private TerraformModuleGitRepository terraformModuleGitRepository;

@Autowired
public TerraformModuleController(
public ModulesMVCController(
TerraformModuleRepository terraformModuleRepository,
TerraformModuleGitRepository terraformModuleGitRepository) {
this.terraformModuleRepository = terraformModuleRepository;
this.terraformModuleGitRepository = terraformModuleGitRepository;
}

@GetMapping("/modules")
public String modulesList(Model model, User user){
if(user.isAdmin()){
model.addAttribute("modules", terraformModuleRepository.findAll());
}
else{
model.addAttribute("modules", terraformModuleRepository.findAllByAuthorizedTeamsContaining(user.getTeam()));
}

public String modulesList(){
return "modules";
}

Expand All @@ -55,7 +48,7 @@ public String module(@PathVariable String id, Model model, User user){
@PostMapping("/modules/{id}")
public String saveModule(@ModelAttribute TerraformModule module, Model model, User user){
terraformModuleRepository.save(module);
return modulesList(model, user);
return modulesList();
}

@GetMapping("/modules/{id}/description")
Expand Down
38 changes: 25 additions & 13 deletions src/main/resources/templates/modules.html
Original file line number Diff line number Diff line change
Expand Up @@ -24,19 +24,8 @@
</div>
</div>
</div>
<div class="row column1">
<div class="card-columns">
<div th:each="module: ${modules}" class="card" style="width: 18rem;">
<div class="card-body">
<h5 class="card-title" th:text="${module.name}">Card title</h5>
<img sec:authorize="hasRole('ADMIN')" th:attr="src=@{https://img.shields.io/badge/terraform-{version}-blue.svg?style=flat-square(version=${module.cliVersion})},alt=${module.cliVersion},title=${module.cliVersion}" style="margin-bottom: .75rem" />
<p class="card-text" th:text="${module.description}">Some quick example text to build on the card title and make up the bulk of the card's content.</p>
<a href="#" sec:authorize="hasRole('ADMIN')" th:href="@{/modules/{moduleId}(moduleId=${module.id})}" data-toggle="tooltip" title="Edit this module" class="btn btn-primary"><i class="far fa-edit"></i></a>
<a href="#" th:href="@{/modules/{moduleId}/description(moduleId=${module.id})}" data-toggle="tooltip" title="Detail of this module" class="btn btn-primary"><i class="fas fa-info"></i></a>
<a href="#" th:href="@{/modules/{moduleId}/run(moduleId=${module.id})}" data-toggle="tooltip" title="Run this module" class="btn btn-primary"><i class="fas fa-rocket"></i></a>
</div>
</div>
</div>
<div id="modules">

</div>
</div>

Expand All @@ -48,6 +37,21 @@ <h5 class="card-title" th:text="${module.name}">Card title</h5>
<breadcrumb :page="page"></breadcrumb>
</template>

<template id="modules-template">
<b-card-group deck>
<b-card v-for="module in modules"
:title="module.name">
<b-card-text>
<img sec:authorize="hasRole('ADMIN')" :src="'https://img.shields.io/badge/terraform-'+module.cliVersion+'-blue.svg?style=flat-square,alt='+module.cliVersion+',title='+module.cliVersion" style="margin-bottom: .75rem" />
<p :text="module.description">Some quick example text to build on the card title and make up the bulk of the card's content.</p>
<a href="#" sec:authorize="hasRole('ADMIN')" :href="'/modules/'+module.id" data-toggle="tooltip" title="Edit this module" class="btn btn-primary"><i class="far fa-edit"></i></a>
<a href="#" :href="'/modules/'+module.id+'/description'" data-toggle="tooltip" title="Detail of this module" class="btn btn-primary"><i class="fas fa-info"></i></a>
<a href="#" :href="'/modules/'+module.id+'/run'" data-toggle="tooltip" title="Run this module" class="btn btn-primary"><i class="fas fa-rocket"></i></a>
</div>
</b-card-text>
</b-card-group>
</template>

<!-- jQuery & bootstrap-->
<script src="/webjars/jquery/3.0.0/jquery.min.js"></script>
<script src="/webjars/popper.js/1.14.3/umd/popper.min.js"></script>
Expand All @@ -69,6 +73,14 @@ <h5 class="card-title" th:text="${module.name}">Card title</h5>
});
});

$.get("/api/modules").then(modules => {
new Vue({
el: "#modules",
data: () => ({modules}),
template: "#modules-template"
});
});

new Vue({
el: "#navigation",
data: () => ({ page: 'modules' }),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,14 +16,15 @@
import java.util.Optional;

import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.*;

@ExtendWith(MockitoExtension.class)
class TerraformModuleControllerTest {
class ModulesMVCControllerTest {

private TerraformModuleController controller;
private ModulesMVCController controller;

@Mock
private TerraformModuleRepository moduleRepository;
Expand All @@ -39,7 +40,7 @@ class TerraformModuleControllerTest {

@BeforeEach
void setup() {
controller = new TerraformModuleController(moduleRepository, moduleGitRepository);
controller = new ModulesMVCController(moduleRepository, moduleGitRepository);
standardUser.setTeam(userTeam);
}

Expand Down Expand Up @@ -104,29 +105,15 @@ void readme_shouldThrowExceptionIfModuleNotFound() {
}

@Test
void modulesList_shouldShowAllModules_forAdminUser(){
void modulesList_shouldShowModulesView(){
// given
var model = mock(Model.class);

// when
controller.modulesList(model, admin);
var res = controller.modulesList();

// then
verify(moduleRepository).findAll();
verify(model).addAttribute(eq("modules"), any());
}

@Test
void modulesList_shouldShowUserTeamModules_forStandardUser(){
// given
var model = mock(Model.class);

// when
controller.modulesList(model, standardUser);

// then
verify(moduleRepository).findAllByAuthorizedTeamsContaining(userTeam);
verify(model).addAttribute(eq("modules"), any());
assertEquals("modules", res);
}

@Test
Expand Down

0 comments on commit fa13411

Please sign in to comment.