Compare View

switch
from
...
to
 
Commits (2)
Showing 151 changed files   Show diff stats
.idea/2020-Herik-SRH.iml 0 → 100644
@@ -0,0 +1,9 @@ @@ -0,0 +1,9 @@
  1 +<?xml version="1.0" encoding="UTF-8"?>
  2 +<module type="JAVA_MODULE" version="4">
  3 + <component name="NewModuleRootManager" inherit-compiler-output="true">
  4 + <exclude-output />
  5 + <content url="file://$MODULE_DIR$" />
  6 + <orderEntry type="inheritedJdk" />
  7 + <orderEntry type="sourceFolder" forTests="false" />
  8 + </component>
  9 +</module>
0 \ No newline at end of file 10 \ No newline at end of file
.idea/modules.xml 0 → 100644
@@ -0,0 +1,8 @@ @@ -0,0 +1,8 @@
  1 +<?xml version="1.0" encoding="UTF-8"?>
  2 +<project version="4">
  3 + <component name="ProjectModuleManager">
  4 + <modules>
  5 + <module fileurl="file://$PROJECT_DIR$/.idea/2020-Herik-SRH.iml" filepath="$PROJECT_DIR$/.idea/2020-Herik-SRH.iml" />
  6 + </modules>
  7 + </component>
  8 +</project>
0 \ No newline at end of file 9 \ No newline at end of file
.idea/sonarlint/issuestore/5/d/5d3445d1560f9fb50fd22131b2387e4661ecc6d7 0 → 100644
.idea/sonarlint/issuestore/8/e/8ec9a00bfd09b3190ac6b22251dbb1aa95a0579d 0 → 100644
.idea/sonarlint/issuestore/9/6/962c419380565e1b39f0c2c642d055bb68106743 0 → 100644
.idea/sonarlint/issuestore/a/c/acd061af923379b136810cb92f99558057249ef9 0 → 100644
.idea/sonarlint/issuestore/b/d/bde5d5ddddf6982d30196f10e83c423802e01b75 0 → 100644
.idea/sonarlint/issuestore/index.pb 0 → 100644
No preview for this file type
.idea/vcs.xml 0 → 100644
@@ -0,0 +1,6 @@ @@ -0,0 +1,6 @@
  1 +<?xml version="1.0" encoding="UTF-8"?>
  2 +<project version="4">
  3 + <component name="VcsDirectoryMappings">
  4 + <mapping directory="" vcs="Git" />
  5 + </component>
  6 +</project>
0 \ No newline at end of file 7 \ No newline at end of file
.idea/workspace.xml 0 → 100644
@@ -0,0 +1,42 @@ @@ -0,0 +1,42 @@
  1 +<?xml version="1.0" encoding="UTF-8"?>
  2 +<project version="4">
  3 + <component name="ChangeListManager">
  4 + <list default="true" id="d16a14de-0ce4-449c-88ef-95e346e97466" name="Default Changelist" comment="" />
  5 + <option name="SHOW_DIALOG" value="false" />
  6 + <option name="HIGHLIGHT_CONFLICTS" value="true" />
  7 + <option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
  8 + <option name="LAST_RESOLUTION" value="IGNORE" />
  9 + </component>
  10 + <component name="Git.Settings">
  11 + <option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
  12 + </component>
  13 + <component name="ProjectId" id="1eEDyolyBaYceGht1XHEwSuoSEW" />
  14 + <component name="ProjectViewState">
  15 + <option name="hideEmptyMiddlePackages" value="true" />
  16 + <option name="showLibraryContents" value="true" />
  17 + </component>
  18 + <component name="PropertiesComponent">
  19 + <property name="RunOnceActivity.OpenProjectViewOnStart" value="true" />
  20 + <property name="RunOnceActivity.ShowReadmeOnStart" value="true" />
  21 + <property name="last_opened_file_path" value="$PROJECT_DIR$/../srh-backend" />
  22 + </component>
  23 + <component name="SvnConfiguration">
  24 + <configuration />
  25 + </component>
  26 + <component name="TaskManager">
  27 + <task active="true" id="Default" summary="Default task">
  28 + <changelist id="d16a14de-0ce4-449c-88ef-95e346e97466" name="Default Changelist" comment="" />
  29 + <created>1593878115840</created>
  30 + <option name="number" value="Default" />
  31 + <option name="presentableId" value="Default" />
  32 + <updated>1593878115840</updated>
  33 + </task>
  34 + <servers />
  35 + </component>
  36 + <component name="WindowStateProjectService">
  37 + <state x="466" y="144" width="424" height="480" key="FileChooserDialogImpl" timestamp="1593954397371">
  38 + <screen x="0" y="30" width="1366" height="738" />
  39 + </state>
  40 + <state x="466" y="144" width="424" height="480" key="FileChooserDialogImpl/0.30.1366.738@0.30.1366.738" timestamp="1593954397371" />
  41 + </component>
  42 +</project>
0 \ No newline at end of file 43 \ No newline at end of file
codigos/backend/pom.xml
@@ -36,6 +36,10 @@ @@ -36,6 +36,10 @@
36 <groupId>org.springframework.boot</groupId> 36 <groupId>org.springframework.boot</groupId>
37 <artifactId>spring-boot-starter-security</artifactId> 37 <artifactId>spring-boot-starter-security</artifactId>
38 </dependency> 38 </dependency>
  39 + <dependency>
  40 + <groupId>org.springframework.boot</groupId>
  41 + <artifactId>spring-boot-starter-mail</artifactId>
  42 + </dependency>
39 <dependency> 43 <dependency>
40 <groupId>de.codecentric</groupId> 44 <groupId>de.codecentric</groupId>
41 <artifactId>spring-boot-admin-starter-client</artifactId> 45 <artifactId>spring-boot-admin-starter-client</artifactId>
codigos/backend/src/main/java/com/srh/api/algorithms/AlgorithmCalc.java 0 → 100644
@@ -0,0 +1,10 @@ @@ -0,0 +1,10 @@
  1 +package com.srh.api.algorithms;
  2 +
  3 +import com.srh.api.algorithms.structure.RecommendationsByUser;
  4 +import com.srh.api.dto.resource.RecommendationForm;
  5 +
  6 +import java.util.List;
  7 +
  8 +public interface AlgorithmCalc {
  9 + public List<RecommendationsByUser> calc(RecommendationForm recommendationInfo);
  10 +}
codigos/backend/src/main/java/com/srh/api/algorithms/AlgorithmStrategy.java 0 → 100644
@@ -0,0 +1,29 @@ @@ -0,0 +1,29 @@
  1 +package com.srh.api.algorithms;
  2 +
  3 +import com.srh.api.algorithms.strategies.*;
  4 +import com.srh.api.error.exception.InvalidAlgorithmRecommendationException;
  5 +import lombok.SneakyThrows;
  6 +
  7 +public class AlgorithmStrategy {
  8 + @SneakyThrows
  9 + public static AlgorithmCalc findInstance(Integer algorithmId) {
  10 + String idValue = String.valueOf(algorithmId);
  11 +
  12 + switch (idValue) {
  13 + case "1":
  14 + return new Collaborative();
  15 + case "2":
  16 + return new BasedContent();
  17 + case "3":
  18 + return new WeightedHybrid();
  19 + case "4":
  20 + return new WeightedHybridWithThreads();
  21 + case "5":
  22 + return new MixedHybrid();
  23 + case "6":
  24 + return new MixedHybridWithThreads();
  25 + default:
  26 + throw new InvalidAlgorithmRecommendationException("Algoritmo inválido");
  27 + }
  28 + }
  29 +}
codigos/backend/src/main/java/com/srh/api/algorithms/strategies/BasedContent.java 0 → 100644
@@ -0,0 +1,15 @@ @@ -0,0 +1,15 @@
  1 +package com.srh.api.algorithms.strategies;
  2 +
  3 +import com.srh.api.algorithms.AlgorithmCalc;
  4 +import com.srh.api.algorithms.structure.RecommendationsByUser;
  5 +import com.srh.api.dto.resource.RecommendationForm;
  6 +import com.srh.api.model.Evaluator;
  7 +
  8 +import java.util.List;
  9 +
  10 +public class BasedContent implements AlgorithmCalc {
  11 + @Override
  12 + public List<RecommendationsByUser> calc(RecommendationForm recommendationForm) {
  13 + return null;
  14 + }
  15 +}
codigos/backend/src/main/java/com/srh/api/algorithms/strategies/Collaborative.java 0 → 100644
@@ -0,0 +1,111 @@ @@ -0,0 +1,111 @@
  1 +package com.srh.api.algorithms.strategies;
  2 +
  3 +import com.srh.api.algorithms.AlgorithmCalc;
  4 +import com.srh.api.algorithms.structure.RecommendationsByUser;
  5 +import com.srh.api.builder.RecommendationBuilder;
  6 +import com.srh.api.dto.resource.RecommendationForm;
  7 +import com.srh.api.model.*;
  8 +import com.srh.api.repository.EvaluatorRepository;
  9 +import com.srh.api.repository.ItemRepository;
  10 +import com.srh.api.repository.ProjectRepository;
  11 +import com.srh.api.repository.RecommendationRepository;
  12 +import com.srh.api.service.AlgorithmService;
  13 +import com.srh.api.service.EvaluatorService;
  14 +import com.srh.api.service.ProjectService;
  15 +import org.springframework.beans.factory.annotation.Autowired;
  16 +import org.springframework.data.domain.Page;
  17 +import org.springframework.data.domain.Pageable;
  18 +
  19 +import java.time.LocalDateTime;
  20 +import java.util.ArrayList;
  21 +import java.util.List;
  22 +import java.util.Random;
  23 +
  24 +public class Collaborative implements AlgorithmCalc {
  25 + @Autowired
  26 + private EvaluatorService evaluatorService;
  27 +
  28 + @Autowired
  29 + private ItemRepository itemRepository;
  30 +
  31 + @Autowired
  32 + private RecommendationRepository recommendationRepository;
  33 +
  34 + @Autowired
  35 + private ProjectRepository projectRepository;
  36 +
  37 + @Autowired
  38 + private ProjectService projectService;
  39 +
  40 + @Autowired
  41 + private AlgorithmService algorithmService;
  42 +
  43 + @Override
  44 + public List<RecommendationsByUser> calc(RecommendationForm recommendationForm) {
  45 + Iterable<Evaluator> evaluators = evaluatorService.listAll();
  46 + List<RecommendationsByUser> recommendations = new ArrayList<>();
  47 +
  48 + for (Evaluator evaluator : evaluators) {
  49 + RecommendationsByUser recommendationsByUser = generateRecommendationByEvaluator(
  50 + evaluator, recommendationForm
  51 + );
  52 +
  53 + if (recommendationsByUser == null) {
  54 + recommendations.add(recommendationsByUser);
  55 + }
  56 + }
  57 +
  58 + return recommendations;
  59 + }
  60 +
  61 + private RecommendationsByUser generateRecommendationByEvaluator(Evaluator evaluator,
  62 + RecommendationForm recommendationForm) {
  63 + Random random = new Random();
  64 +
  65 + if (random.nextInt(2) == 1) {
  66 + RecommendationsByUser recommendationsByUser = new RecommendationsByUser();
  67 +
  68 + recommendationsByUser.setEvaluator(evaluator);
  69 + recommendationsByUser.setRecommendations(calculateRecommendations(evaluator,
  70 + recommendationForm));
  71 +
  72 + return recommendationsByUser;
  73 + }
  74 +
  75 + return null;
  76 + }
  77 +
  78 + private List<Recommendation> calculateRecommendations(Evaluator evaluator,
  79 + RecommendationForm recommendationForm) {
  80 + Random random = new Random();
  81 + List<Recommendation> recommendations = new ArrayList<>();
  82 +
  83 + Project project = projectService.find(recommendationForm.getProjectId());
  84 + Integer matrixId = project.getLastMatrixId() + 1;
  85 + Algorithm algorithm = algorithmService.find(recommendationForm.getAlgorithmId());
  86 +
  87 + for(Item item: itemRepository.findByProject(project)) {
  88 + Double score = random.nextDouble() * 5;
  89 +
  90 + if (score > recommendationForm.getPassingScore()) {
  91 + Recommendation recommendation = RecommendationBuilder.aRecommendation()
  92 + .withAlgorithm(algorithm)
  93 + .withItem(item)
  94 + .withDate(LocalDateTime.now())
  95 + .withEvaluator(evaluator)
  96 + .withRuntimeInSeconds(1)
  97 + .withWeight(score)
  98 + .withMatrixId(matrixId)
  99 + .build();
  100 +
  101 + recommendationRepository.save(recommendation);
  102 + recommendations.add(recommendation);
  103 + }
  104 + }
  105 +
  106 + project.setLastMatrixId(matrixId);
  107 + projectService.save(project);
  108 +
  109 + return recommendations;
  110 + }
  111 +}
codigos/backend/src/main/java/com/srh/api/algorithms/strategies/MixedHybrid.java 0 → 100644
@@ -0,0 +1,15 @@ @@ -0,0 +1,15 @@
  1 +package com.srh.api.algorithms.strategies;
  2 +
  3 +import com.srh.api.algorithms.AlgorithmCalc;
  4 +import com.srh.api.algorithms.structure.RecommendationsByUser;
  5 +import com.srh.api.dto.resource.RecommendationForm;
  6 +import com.srh.api.model.Evaluator;
  7 +
  8 +import java.util.List;
  9 +
  10 +public class MixedHybrid implements AlgorithmCalc {
  11 + @Override
  12 + public List<RecommendationsByUser> calc(RecommendationForm recommendationForm) {
  13 + return null;
  14 + }
  15 +}
codigos/backend/src/main/java/com/srh/api/algorithms/strategies/MixedHybridWithThreads.java 0 → 100644
@@ -0,0 +1,15 @@ @@ -0,0 +1,15 @@
  1 +package com.srh.api.algorithms.strategies;
  2 +
  3 +import com.srh.api.algorithms.AlgorithmCalc;
  4 +import com.srh.api.algorithms.structure.RecommendationsByUser;
  5 +import com.srh.api.dto.resource.RecommendationForm;
  6 +import com.srh.api.model.Evaluator;
  7 +
  8 +import java.util.List;
  9 +
  10 +public class MixedHybridWithThreads implements AlgorithmCalc {
  11 + @Override
  12 + public List<RecommendationsByUser> calc(RecommendationForm recommendationForm) {
  13 + return null;
  14 + }
  15 +}
codigos/backend/src/main/java/com/srh/api/algorithms/strategies/WeightedHybrid.java 0 → 100644
@@ -0,0 +1,14 @@ @@ -0,0 +1,14 @@
  1 +package com.srh.api.algorithms.strategies;
  2 +
  3 +import com.srh.api.algorithms.AlgorithmCalc;
  4 +import com.srh.api.algorithms.structure.RecommendationsByUser;
  5 +import com.srh.api.dto.resource.RecommendationForm;
  6 +import com.srh.api.model.Evaluator;
  7 +
  8 +import java.util.List;
  9 +
  10 +public class WeightedHybrid implements AlgorithmCalc {
  11 + public List<RecommendationsByUser> calc(RecommendationForm recommendationForm) {
  12 + return null;
  13 + }
  14 +}
codigos/backend/src/main/java/com/srh/api/algorithms/strategies/WeightedHybridWithThreads.java 0 → 100644
@@ -0,0 +1,14 @@ @@ -0,0 +1,14 @@
  1 +package com.srh.api.algorithms.strategies;
  2 +
  3 +import com.srh.api.algorithms.AlgorithmCalc;
  4 +import com.srh.api.algorithms.structure.RecommendationsByUser;
  5 +import com.srh.api.dto.resource.RecommendationForm;
  6 +
  7 +import java.util.List;
  8 +
  9 +public class WeightedHybridWithThreads implements AlgorithmCalc {
  10 + @Override
  11 + public List<RecommendationsByUser> calc(RecommendationForm recommendationForm) {
  12 + return null;
  13 + }
  14 +}
codigos/backend/src/main/java/com/srh/api/algorithms/structure/RecommendationsByUser.java 0 → 100644
@@ -0,0 +1,13 @@ @@ -0,0 +1,13 @@
  1 +package com.srh.api.algorithms.structure;
  2 +
  3 +import com.srh.api.model.Evaluator;
  4 +import com.srh.api.model.Recommendation;
  5 +import lombok.Data;
  6 +
  7 +import java.util.List;
  8 +
  9 +@Data
  10 +public class RecommendationsByUser {
  11 + private Evaluator evaluator;
  12 + private List<Recommendation> recommendations;
  13 +}
codigos/backend/src/main/java/com/srh/api/algorithms/utils/EuclideanDistance.java 0 → 100644
@@ -0,0 +1,4 @@ @@ -0,0 +1,4 @@
  1 +package com.srh.api.algorithms.utils;
  2 +
  3 +public class EuclideanDistance {
  4 +}
codigos/backend/src/main/java/com/srh/api/builder/ProjectBuilder.java
@@ -11,6 +11,7 @@ public final class ProjectBuilder { @@ -11,6 +11,7 @@ public final class ProjectBuilder {
11 private String description; 11 private String description;
12 private LocalDate date; 12 private LocalDate date;
13 private Boolean visible; 13 private Boolean visible;
  14 + private Integer lastMatrixId;
14 private Situations situation; 15 private Situations situation;
15 private Admin admin; 16 private Admin admin;
16 private List<Evaluator> evaluators; 17 private List<Evaluator> evaluators;
@@ -48,6 +49,11 @@ public final class ProjectBuilder { @@ -48,6 +49,11 @@ public final class ProjectBuilder {
48 return this; 49 return this;
49 } 50 }
50 51
  52 + public ProjectBuilder withLastMatrixId(Integer lastMatrixId) {
  53 + this.lastMatrixId = lastMatrixId;
  54 + return this;
  55 + }
  56 +
51 public ProjectBuilder withSituation(Situations situation) { 57 public ProjectBuilder withSituation(Situations situation) {
52 this.situation = situation; 58 this.situation = situation;
53 return this; 59 return this;
@@ -75,6 +81,7 @@ public final class ProjectBuilder { @@ -75,6 +81,7 @@ public final class ProjectBuilder {
75 project.setDescription(description); 81 project.setDescription(description);
76 project.setDate(date); 82 project.setDate(date);
77 project.setVisible(visible); 83 project.setVisible(visible);
  84 + project.setLastMatrixId(lastMatrixId);
78 project.setSituation(situation); 85 project.setSituation(situation);
79 project.setAdmin(admin); 86 project.setAdmin(admin);
80 project.setEvaluators(evaluators); 87 project.setEvaluators(evaluators);
codigos/backend/src/main/java/com/srh/api/builder/RecommendationBuilder.java
@@ -10,6 +10,7 @@ public final class RecommendationBuilder { @@ -10,6 +10,7 @@ public final class RecommendationBuilder {
10 private Double weight; 10 private Double weight;
11 private LocalDateTime date; 11 private LocalDateTime date;
12 private Integer runtimeInSeconds; 12 private Integer runtimeInSeconds;
  13 + private Integer matrixId;
13 private Algorithm algorithm; 14 private Algorithm algorithm;
14 private Evaluator evaluator; 15 private Evaluator evaluator;
15 private Item item; 16 private Item item;
@@ -42,6 +43,11 @@ public final class RecommendationBuilder { @@ -42,6 +43,11 @@ public final class RecommendationBuilder {
42 return this; 43 return this;
43 } 44 }
44 45
  46 + public RecommendationBuilder withMatrixId(Integer matrixId) {
  47 + this.matrixId = matrixId;
  48 + return this;
  49 + }
  50 +
45 public RecommendationBuilder withAlgorithm(Algorithm algorithm) { 51 public RecommendationBuilder withAlgorithm(Algorithm algorithm) {
46 this.algorithm = algorithm; 52 this.algorithm = algorithm;
47 return this; 53 return this;
@@ -68,6 +74,7 @@ public final class RecommendationBuilder { @@ -68,6 +74,7 @@ public final class RecommendationBuilder {
68 recommendation.setWeight(weight); 74 recommendation.setWeight(weight);
69 recommendation.setDate(date); 75 recommendation.setDate(date);
70 recommendation.setRuntimeInSeconds(runtimeInSeconds); 76 recommendation.setRuntimeInSeconds(runtimeInSeconds);
  77 + recommendation.setMatrixId(matrixId);
71 recommendation.setAlgorithm(algorithm); 78 recommendation.setAlgorithm(algorithm);
72 recommendation.setEvaluator(evaluator); 79 recommendation.setEvaluator(evaluator);
73 recommendation.setItem(item); 80 recommendation.setItem(item);
codigos/backend/src/main/java/com/srh/api/config/DbSeeder.java
1 package com.srh.api.config; 1 package com.srh.api.config;
2 2
  3 +import com.srh.api.builder.AlgorithmBuilder;
3 import com.srh.api.builder.ApiUserBuilder; 4 import com.srh.api.builder.ApiUserBuilder;
4 import com.srh.api.builder.ProfileBuilder; 5 import com.srh.api.builder.ProfileBuilder;
  6 +import com.srh.api.model.Algorithm;
5 import com.srh.api.model.ApiUser; 7 import com.srh.api.model.ApiUser;
6 import com.srh.api.model.Profile; 8 import com.srh.api.model.Profile;
  9 +import com.srh.api.model.TypeRecommendation;
  10 +import com.srh.api.repository.AlgorithmRepository;
7 import com.srh.api.repository.ApiUserRepository; 11 import com.srh.api.repository.ApiUserRepository;
8 import com.srh.api.repository.ProfileRepository; 12 import com.srh.api.repository.ProfileRepository;
9 import org.springframework.beans.factory.annotation.Autowired; 13 import org.springframework.beans.factory.annotation.Autowired;
10 import org.springframework.stereotype.Service; 14 import org.springframework.stereotype.Service;
11 15
12 import java.util.ArrayList; 16 import java.util.ArrayList;
  17 +import java.util.Arrays;
13 import java.util.List; 18 import java.util.List;
14 19
15 @Service 20 @Service
@@ -20,6 +25,9 @@ public class DbSeeder { @@ -20,6 +25,9 @@ public class DbSeeder {
20 @Autowired 25 @Autowired
21 private ProfileRepository profileRepository; 26 private ProfileRepository profileRepository;
22 27
  28 + @Autowired
  29 + private AlgorithmRepository algorithmRepository;
  30 +
23 private Profile adminProfile; 31 private Profile adminProfile;
24 private Profile userProfile; 32 private Profile userProfile;
25 33
@@ -30,6 +38,8 @@ public class DbSeeder { @@ -30,6 +38,8 @@ public class DbSeeder {
30 createApiUserAdmin(); 38 createApiUserAdmin();
31 createApiUserClient(); 39 createApiUserClient();
32 40
  41 + createAlgorithms();
  42 +
33 return true; 43 return true;
34 } 44 }
35 45
@@ -85,4 +95,47 @@ public class DbSeeder { @@ -85,4 +95,47 @@ public class DbSeeder {
85 userProfile = profile; 95 userProfile = profile;
86 profileRepository.save(profile); 96 profileRepository.save(profile);
87 } 97 }
  98 +
  99 + private void createAlgorithms() {
  100 + Algorithm algorithm1 = AlgorithmBuilder.anAlgorithm()
  101 + .withId(1)
  102 + .withName("Filtragem Colaborativa")
  103 + .withTypeRecommendation(TypeRecommendation.COLLABORATIVE)
  104 + .build();
  105 +
  106 + Algorithm algorithm2 = AlgorithmBuilder.anAlgorithm()
  107 + .withId(1)
  108 + .withName("Filtragem Baseada em Conteúdo")
  109 + .withTypeRecommendation(TypeRecommendation.COLLABORATIVE)
  110 + .build();
  111 +
  112 + Algorithm algorithm3 = AlgorithmBuilder.anAlgorithm()
  113 + .withId(1)
  114 + .withName("Filtragem Híbrida ponderada - Single Thread")
  115 + .withTypeRecommendation(TypeRecommendation.COLLABORATIVE)
  116 + .build();
  117 +
  118 + Algorithm algorithm4 = AlgorithmBuilder.anAlgorithm()
  119 + .withId(1)
  120 + .withName("Filtragem Híbrida ponderada - Multi Thread")
  121 + .withTypeRecommendation(TypeRecommendation.COLLABORATIVE)
  122 + .build();
  123 +
  124 + Algorithm algorithm5 = AlgorithmBuilder.anAlgorithm()
  125 + .withId(1)
  126 + .withName("Filtragem Híbrida Mista - Single Thread")
  127 + .withTypeRecommendation(TypeRecommendation.COLLABORATIVE)
  128 + .build();
  129 +
  130 + Algorithm algorithm6 = AlgorithmBuilder.anAlgorithm()
  131 + .withId(1)
  132 + .withName("Filtragem Híbrida Mista - Multi Thread")
  133 + .withTypeRecommendation(TypeRecommendation.COLLABORATIVE)
  134 + .build();
  135 +
  136 + algorithmRepository.saveAll(Arrays.asList(
  137 + algorithm1, algorithm2, algorithm3,
  138 + algorithm4, algorithm5, algorithm6
  139 + ));
  140 + }
88 } 141 }
codigos/backend/src/main/java/com/srh/api/config/EmailConfig.java 0 → 100644
@@ -0,0 +1,29 @@ @@ -0,0 +1,29 @@
  1 +package com.srh.api.config;
  2 +
  3 +import org.springframework.context.annotation.Bean;
  4 +import org.springframework.mail.javamail.JavaMailSender;
  5 +import org.springframework.mail.javamail.JavaMailSenderImpl;
  6 +import org.springframework.stereotype.Component;
  7 +
  8 +import java.util.Properties;
  9 +
  10 +@Component
  11 +public class EmailConfig {
  12 + @Bean
  13 + public JavaMailSender getJavaMailSender() {
  14 + JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
  15 + mailSender.setHost("smtp.gmail.com");
  16 + mailSender.setPort(587);
  17 +
  18 + mailSender.setUsername("my.gmail@gmail.com");
  19 + mailSender.setPassword("password");
  20 +
  21 + Properties props = mailSender.getJavaMailProperties();
  22 + props.put("mail.transport.protocol", "smtp");
  23 + props.put("mail.smtp.auth", "true");
  24 + props.put("mail.smtp.starttls.enable", "true");
  25 + props.put("mail.debug", "true");
  26 +
  27 + return mailSender;
  28 + }
  29 +}
codigos/backend/src/main/java/com/srh/api/controller/AdminController.java
@@ -2,9 +2,14 @@ package com.srh.api.controller; @@ -2,9 +2,14 @@ package com.srh.api.controller;
2 2
3 import com.srh.api.dto.resource.AdminDto; 3 import com.srh.api.dto.resource.AdminDto;
4 import com.srh.api.dto.resource.AdminForm; 4 import com.srh.api.dto.resource.AdminForm;
  5 +import com.srh.api.dto.resource.ProjectDto;
  6 +import com.srh.api.dto.resource.TypeItemDto;
5 import com.srh.api.hypermedia.AdminModelAssembler; 7 import com.srh.api.hypermedia.AdminModelAssembler;
6 import com.srh.api.model.Admin; 8 import com.srh.api.model.Admin;
  9 +import com.srh.api.model.Project;
  10 +import com.srh.api.model.TypeItem;
7 import com.srh.api.service.AdminService; 11 import com.srh.api.service.AdminService;
  12 +import com.srh.api.utils.PageUtil;
8 import lombok.SneakyThrows; 13 import lombok.SneakyThrows;
9 import org.springframework.beans.factory.annotation.Autowired; 14 import org.springframework.beans.factory.annotation.Autowired;
10 import org.springframework.data.domain.Page; 15 import org.springframework.data.domain.Page;
@@ -35,6 +40,9 @@ public class AdminController { @@ -35,6 +40,9 @@ public class AdminController {
35 @Autowired 40 @Autowired
36 private PagedResourcesAssembler<AdminDto> pagedResourcesAssembler; 41 private PagedResourcesAssembler<AdminDto> pagedResourcesAssembler;
37 42
  43 + @Autowired
  44 + private PagedResourcesAssembler<ProjectDto> projectDtoPagedResourcesAssembler;
  45 +
38 @GetMapping 46 @GetMapping
39 public PagedModel<EntityModel<AdminDto>> listAll(@PageableDefault(page = 0, size = 5) Pageable pageInfo) { 47 public PagedModel<EntityModel<AdminDto>> listAll(@PageableDefault(page = 0, size = 5) Pageable pageInfo) {
40 Page<Admin> admins = adminService.findAll(pageInfo); 48 Page<Admin> admins = adminService.findAll(pageInfo);
@@ -73,4 +81,17 @@ public class AdminController { @@ -73,4 +81,17 @@ public class AdminController {
73 adminService.delete(id); 81 adminService.delete(id);
74 return ResponseEntity.noContent().build(); 82 return ResponseEntity.noContent().build();
75 } 83 }
  84 +
  85 + @GetMapping("{adminId}/projects")
  86 + public PagedModel<EntityModel<ProjectDto>> findProjectsByAdmin(
  87 + @PathVariable Integer adminId,
  88 + @PageableDefault(page = 0, size = 5) Pageable pageInfo
  89 + ) {
  90 + PageUtil<Project> pageUtil = new PageUtil<>(pageInfo, adminService.
  91 + listProjectsByAdmin(adminId));
  92 +
  93 + return projectDtoPagedResourcesAssembler.toModel(ProjectDto.convert(
  94 + pageUtil.getPage()
  95 + ));
  96 + }
76 } 97 }
codigos/backend/src/main/java/com/srh/api/controller/ForgetPasswordController.java 0 → 100644
@@ -0,0 +1,4 @@ @@ -0,0 +1,4 @@
  1 +package com.srh.api.controller;
  2 +
  3 +public class ForgetPasswordController {
  4 +}
codigos/backend/src/main/java/com/srh/api/controller/LoginAdminController.java 0 → 100644
@@ -0,0 +1,29 @@ @@ -0,0 +1,29 @@
  1 +package com.srh.api.controller;
  2 +
  3 +import com.srh.api.dto.resource.LoginClientForm;
  4 +import com.srh.api.service.LoginClientDto;
  5 +import com.srh.api.service.LoginClientService;
  6 +import org.springframework.beans.factory.annotation.Autowired;
  7 +import org.springframework.http.ResponseEntity;
  8 +import org.springframework.web.bind.annotation.PostMapping;
  9 +import org.springframework.web.bind.annotation.RequestBody;
  10 +import org.springframework.web.bind.annotation.RequestMapping;
  11 +import org.springframework.web.bind.annotation.RestController;
  12 +
  13 +import javax.validation.Valid;
  14 +
  15 +@RestController
  16 +@RequestMapping("/admins/login")
  17 +public class LoginAdminController {
  18 + @Autowired
  19 + private LoginClientService loginClientService;
  20 +
  21 + @PostMapping
  22 + public ResponseEntity<LoginClientDto> loginUser(@RequestBody @Valid LoginClientForm loginForm) {
  23 + Boolean validUser = loginClientService.generateLoginTokenByAdmins(
  24 + loginForm.getLogin(), loginForm.getPassword()
  25 + );
  26 + Integer adminId = loginClientService.getAdminId(loginForm.getLogin());
  27 + return ResponseEntity.ok(new LoginClientDto(validUser, adminId));
  28 + }
  29 +}
codigos/backend/src/main/java/com/srh/api/controller/LoginEvaluatorController.java 0 → 100644
@@ -0,0 +1,29 @@ @@ -0,0 +1,29 @@
  1 +package com.srh.api.controller;
  2 +
  3 +import com.srh.api.dto.resource.LoginClientForm;
  4 +import com.srh.api.service.LoginClientDto;
  5 +import com.srh.api.service.LoginClientService;
  6 +import org.springframework.beans.factory.annotation.Autowired;
  7 +import org.springframework.http.ResponseEntity;
  8 +import org.springframework.web.bind.annotation.PostMapping;
  9 +import org.springframework.web.bind.annotation.RequestBody;
  10 +import org.springframework.web.bind.annotation.RequestMapping;
  11 +import org.springframework.web.bind.annotation.RestController;
  12 +
  13 +import javax.validation.Valid;
  14 +
  15 +@RestController
  16 +@RequestMapping("/evaluators/login")
  17 +public class LoginEvaluatorController {
  18 + @Autowired
  19 + private LoginClientService loginClientService;
  20 +
  21 + @PostMapping
  22 + public ResponseEntity<LoginClientDto> loginUser(@RequestBody @Valid LoginClientForm loginForm) {
  23 + Boolean validUser = loginClientService.verifyEvaluators(
  24 + loginForm.getLogin(), loginForm.getPassword()
  25 + );
  26 + Integer evaluatorId = loginClientService.getEvaluatorId(loginForm.getLogin());
  27 + return ResponseEntity.ok(new LoginClientDto(validUser, evaluatorId));
  28 + }
  29 +}
codigos/backend/src/main/java/com/srh/api/controller/ProjectController.java
1 package com.srh.api.controller; 1 package com.srh.api.controller;
2 2
3 -import com.srh.api.dto.resource.ItemDto;  
4 -import com.srh.api.dto.resource.ProjectDto;  
5 -import com.srh.api.dto.resource.ProjectForm;  
6 -import com.srh.api.hypermedia.ItemModelAssembler; 3 +import com.srh.api.dto.resource.*;
7 import com.srh.api.hypermedia.ProjectModelAssembler; 4 import com.srh.api.hypermedia.ProjectModelAssembler;
8 -import com.srh.api.model.Item;  
9 -import com.srh.api.model.Project; 5 +import com.srh.api.model.*;
10 import com.srh.api.service.ProjectService; 6 import com.srh.api.service.ProjectService;
11 import com.srh.api.utils.PageUtil; 7 import com.srh.api.utils.PageUtil;
12 import lombok.SneakyThrows; 8 import lombok.SneakyThrows;
@@ -42,6 +38,18 @@ public class ProjectController { @@ -42,6 +38,18 @@ public class ProjectController {
42 @Autowired 38 @Autowired
43 private PagedResourcesAssembler<ItemDto> itemDtoPagedResourcesAssembler; 39 private PagedResourcesAssembler<ItemDto> itemDtoPagedResourcesAssembler;
44 40
  41 + @Autowired
  42 + private PagedResourcesAssembler<RecommendationDto> recommendationDtoPagedResourcesAssembler;
  43 +
  44 + @Autowired
  45 + private PagedResourcesAssembler<ItemRatingDto> itemRatingDtoPagedResourcesAssembler;
  46 +
  47 + @Autowired
  48 + private PagedResourcesAssembler<TagDto> tagDtoPagedResourcesAssembler;
  49 +
  50 + @Autowired
  51 + private PagedResourcesAssembler<TypeItemDto> typeItemDtoPagedResourcesAssembler;
  52 +
45 @GetMapping 53 @GetMapping
46 public PagedModel<EntityModel<ProjectDto>> listAll(@PageableDefault(page = 0, size = 5) 54 public PagedModel<EntityModel<ProjectDto>> listAll(@PageableDefault(page = 0, size = 5)
47 Pageable pageInfo) { 55 Pageable pageInfo) {
@@ -89,9 +97,61 @@ public class ProjectController { @@ -89,9 +97,61 @@ public class ProjectController {
89 @PathVariable Integer projectId, 97 @PathVariable Integer projectId,
90 @PageableDefault(page = 0, size = 5) Pageable pageInfo 98 @PageableDefault(page = 0, size = 5) Pageable pageInfo
91 ) { 99 ) {
92 - Project project = projectService.find(projectId);  
93 - PageUtil<Item> pageUtil = new PageUtil<>(pageInfo, project.getItens()); 100 + PageUtil<Item> pageUtil = new PageUtil<>(pageInfo, projectService.
  101 + listItensByProject(projectId));
94 102
95 return itemDtoPagedResourcesAssembler.toModel(ItemDto.convert(pageUtil.getPage())); 103 return itemDtoPagedResourcesAssembler.toModel(ItemDto.convert(pageUtil.getPage()));
96 } 104 }
  105 +
  106 + @GetMapping("{projectId}/recommendations")
  107 + public PagedModel<EntityModel<RecommendationDto>> findRecommendationsByProject(
  108 + @PathVariable Integer projectId,
  109 + @PageableDefault(page = 0, size = 5) Pageable pageInfo
  110 + ) {
  111 + PageUtil<Recommendation> pageUtil = new PageUtil<>(pageInfo, projectService.
  112 + listRecommendationsByProject(projectId));
  113 +
  114 + return recommendationDtoPagedResourcesAssembler.toModel(RecommendationDto.convert(
  115 + pageUtil.getPage()
  116 + ));
  117 + }
  118 +
  119 + @GetMapping("{projectId}/itemratings")
  120 + public PagedModel<EntityModel<ItemRatingDto>> findItemRatingsByProject(
  121 + @PathVariable Integer projectId,
  122 + @PageableDefault(page = 0, size = 5) Pageable pageInfo
  123 + ) {
  124 + PageUtil<ItemRating> pageUtil = new PageUtil<>(pageInfo, projectService.
  125 + listItemRatingsByProject(projectId));
  126 +
  127 + return itemRatingDtoPagedResourcesAssembler.toModel(ItemRatingDto.convert(
  128 + pageUtil.getPage()
  129 + ));
  130 + }
  131 +
  132 + @GetMapping("{projectId}/tags")
  133 + public PagedModel<EntityModel<TagDto>> findTagsByProject(
  134 + @PathVariable Integer projectId,
  135 + @PageableDefault(page = 0, size = 5) Pageable pageInfo
  136 + ) {
  137 + PageUtil<Tag> pageUtil = new PageUtil<>(pageInfo, projectService.
  138 + listTagsByProject(projectId));
  139 +
  140 + return tagDtoPagedResourcesAssembler.toModel(TagDto.convert(
  141 + pageUtil.getPage()
  142 + ));
  143 + }
  144 +
  145 + @GetMapping("{projectId}/typeitens")
  146 + public PagedModel<EntityModel<TypeItemDto>> findTypeItensByProject(
  147 + @PathVariable Integer projectId,
  148 + @PageableDefault(page = 0, size = 5) Pageable pageInfo
  149 + ) {
  150 + PageUtil<TypeItem> pageUtil = new PageUtil<>(pageInfo, projectService.
  151 + listTypeItensByProject(projectId));
  152 +
  153 + return typeItemDtoPagedResourcesAssembler.toModel(TypeItemDto.convert(
  154 + pageUtil.getPage()
  155 + ));
  156 + }
97 } 157 }
codigos/backend/src/main/java/com/srh/api/controller/RecommendationController.java
1 package com.srh.api.controller; 1 package com.srh.api.controller;
2 2
  3 +import com.srh.api.algorithms.structure.RecommendationsByUser;
3 import com.srh.api.dto.resource.RecommendationDto; 4 import com.srh.api.dto.resource.RecommendationDto;
  5 +import com.srh.api.dto.resource.RecommendationForm;
  6 +import com.srh.api.dto.resource.RecommendationUserDto;
4 import com.srh.api.hypermedia.RecommendationModelAssembler; 7 import com.srh.api.hypermedia.RecommendationModelAssembler;
5 import com.srh.api.model.Recommendation; 8 import com.srh.api.model.Recommendation;
6 import com.srh.api.service.RecommendationService; 9 import com.srh.api.service.RecommendationService;
@@ -15,6 +18,10 @@ import org.springframework.http.ResponseEntity; @@ -15,6 +18,10 @@ import org.springframework.http.ResponseEntity;
15 import org.springframework.web.bind.annotation.*; 18 import org.springframework.web.bind.annotation.*;
16 19
17 import javax.transaction.Transactional; 20 import javax.transaction.Transactional;
  21 +import javax.validation.Valid;
  22 +
  23 +import java.util.ArrayList;
  24 +import java.util.List;
18 25
19 import static com.srh.api.dto.resource.RecommendationDto.convert; 26 import static com.srh.api.dto.resource.RecommendationDto.convert;
20 27
@@ -43,6 +50,19 @@ public class RecommendationController { @@ -43,6 +50,19 @@ public class RecommendationController {
43 return recommendationModelAssembler.toModel(new RecommendationDto(recommendation)); 50 return recommendationModelAssembler.toModel(new RecommendationDto(recommendation));
44 } 51 }
45 52
  53 + @PostMapping
  54 + public ResponseEntity<List<RecommendationUserDto>> generateRecommendations(
  55 + @RequestBody @Valid RecommendationForm form) {
  56 + List<RecommendationsByUser> recommendations = recommendationService.generateRecommendation(form);
  57 + List<RecommendationUserDto> recommendationUserDtos = new ArrayList<>();
  58 +
  59 + for (RecommendationsByUser recommendationByUser : recommendations) {
  60 + recommendationUserDtos.add(new RecommendationUserDto(recommendationByUser));
  61 + }
  62 +
  63 + return ResponseEntity.ok(recommendationUserDtos);
  64 + }
  65 +
46 @DeleteMapping("/{id}") 66 @DeleteMapping("/{id}")
47 @Transactional 67 @Transactional
48 public ResponseEntity<Void> delete(@PathVariable Integer id) { 68 public ResponseEntity<Void> delete(@PathVariable Integer id) {
codigos/backend/src/main/java/com/srh/api/dto/resource/ItemForm.java
@@ -2,8 +2,10 @@ package com.srh.api.dto.resource; @@ -2,8 +2,10 @@ package com.srh.api.dto.resource;
2 2
3 import com.srh.api.builder.ItemBuilder; 3 import com.srh.api.builder.ItemBuilder;
4 import com.srh.api.builder.ProjectBuilder; 4 import com.srh.api.builder.ProjectBuilder;
  5 +import com.srh.api.builder.TypeItemBuilder;
5 import com.srh.api.model.Item; 6 import com.srh.api.model.Item;
6 import com.srh.api.model.Project; 7 import com.srh.api.model.Project;
  8 +import com.srh.api.model.TypeItem;
7 import lombok.AllArgsConstructor; 9 import lombok.AllArgsConstructor;
8 import lombok.Getter; 10 import lombok.Getter;
9 import lombok.NoArgsConstructor; 11 import lombok.NoArgsConstructor;
@@ -29,11 +31,26 @@ public class ItemForm { @@ -29,11 +31,26 @@ public class ItemForm {
29 @NotNull 31 @NotNull
30 private Integer projectId; 32 private Integer projectId;
31 33
  34 + private Integer typeItemId;
  35 +
32 public Item build() { 36 public Item build() {
33 Project project = ProjectBuilder.aProject() 37 Project project = ProjectBuilder.aProject()
34 .withId(projectId) 38 .withId(projectId)
35 .build(); 39 .build();
36 40
  41 + if (typeItemId != null) {
  42 + TypeItem typeItem = TypeItemBuilder.aTypeItem()
  43 + .withId(typeItemId)
  44 + .build();
  45 +
  46 + return ItemBuilder.anItem()
  47 + .withName(name)
  48 + .withDescription(description)
  49 + .withProject(project)
  50 + .withTypeItem(typeItem)
  51 + .build();
  52 + }
  53 +
37 return ItemBuilder.anItem() 54 return ItemBuilder.anItem()
38 .withName(name) 55 .withName(name)
39 .withDescription(description) 56 .withDescription(description)
codigos/backend/src/main/java/com/srh/api/dto/resource/LoginClientForm.java 0 → 100644
@@ -0,0 +1,24 @@ @@ -0,0 +1,24 @@
  1 +package com.srh.api.dto.resource;
  2 +
  3 +import lombok.AllArgsConstructor;
  4 +import lombok.Getter;
  5 +import lombok.NoArgsConstructor;
  6 +import org.hibernate.validator.constraints.Length;
  7 +
  8 +import javax.validation.constraints.NotEmpty;
  9 +import javax.validation.constraints.NotNull;
  10 +
  11 +@Getter
  12 +@AllArgsConstructor
  13 +@NoArgsConstructor
  14 +public class LoginClientForm {
  15 + @NotNull
  16 + @NotEmpty
  17 + @Length(min = 3)
  18 + private String login;
  19 +
  20 + @NotNull
  21 + @NotEmpty
  22 + @Length(min = 6)
  23 + private String password;
  24 +}
codigos/backend/src/main/java/com/srh/api/dto/resource/ProjectForm.java
@@ -51,6 +51,7 @@ public class ProjectForm { @@ -51,6 +51,7 @@ public class ProjectForm {
51 .withSituation(Situations.valueOf(situation)) 51 .withSituation(Situations.valueOf(situation))
52 .withDate(LocalDate.now()) 52 .withDate(LocalDate.now())
53 .withVisible(visible) 53 .withVisible(visible)
  54 + .withLastMatrixId(0)
54 .build(); 55 .build();
55 } 56 }
56 } 57 }
codigos/backend/src/main/java/com/srh/api/dto/resource/RecommendationForm.java 0 → 100644
@@ -0,0 +1,28 @@ @@ -0,0 +1,28 @@
  1 +package com.srh.api.dto.resource;
  2 +
  3 +import lombok.AllArgsConstructor;
  4 +import lombok.Getter;
  5 +import lombok.NoArgsConstructor;
  6 +
  7 +import javax.validation.constraints.Max;
  8 +import javax.validation.constraints.Min;
  9 +import javax.validation.constraints.NotNull;
  10 +
  11 +@Getter
  12 +@AllArgsConstructor
  13 +@NoArgsConstructor
  14 +public class RecommendationForm {
  15 + @Min(value = 0)
  16 + @Max(value = 5)
  17 + @NotNull
  18 + private Double passingScore;
  19 +
  20 + @NotNull
  21 + private Integer algorithmId;
  22 +
  23 + @NotNull
  24 + private Boolean offline;
  25 +
  26 + @NotNull
  27 + private Integer projectId;
  28 +}
codigos/backend/src/main/java/com/srh/api/dto/resource/RecommendationUserDto.java 0 → 100644
@@ -0,0 +1,21 @@ @@ -0,0 +1,21 @@
  1 +package com.srh.api.dto.resource;
  2 +
  3 +import com.srh.api.algorithms.structure.RecommendationsByUser;
  4 +import com.srh.api.model.Recommendation;
  5 +import org.springframework.data.domain.Page;
  6 +
  7 +import java.util.List;
  8 +
  9 +public class RecommendationUserDto {
  10 + private Integer userId;
  11 + private List<Recommendation> recommendations;
  12 +
  13 + public RecommendationUserDto(RecommendationsByUser recommendationsByUser) {
  14 + this.userId = recommendationsByUser.getEvaluator().getId();
  15 + this.recommendations = recommendationsByUser.getRecommendations();
  16 + }
  17 +
  18 + public static Page<RecommendationUserDto> convert(Page<RecommendationsByUser> recommendations) {
  19 + return recommendations.map(RecommendationUserDto::new);
  20 + }
  21 +}
codigos/backend/src/main/java/com/srh/api/error/exception/InvalidAlgorithmRecommendationException.java 0 → 100644
@@ -0,0 +1,7 @@ @@ -0,0 +1,7 @@
  1 +package com.srh.api.error.exception;
  2 +
  3 +public class InvalidAlgorithmRecommendationException extends Exception {
  4 + public InvalidAlgorithmRecommendationException(String message) {
  5 + super(message);
  6 + }
  7 +}
codigos/backend/src/main/java/com/srh/api/error/exception/InvalidLoginUserException.java 0 → 100644
@@ -0,0 +1,7 @@ @@ -0,0 +1,7 @@
  1 +package com.srh.api.error.exception;
  2 +
  3 +public class InvalidLoginUserException extends Exception {
  4 + public InvalidLoginUserException() {
  5 + super();
  6 + }
  7 +}
codigos/backend/src/main/java/com/srh/api/error/exception/InvalidPasswordUserException.java 0 → 100644
@@ -0,0 +1,7 @@ @@ -0,0 +1,7 @@
  1 +package com.srh.api.error.exception;
  2 +
  3 +public class InvalidPasswordUserException extends Exception {
  4 + public InvalidPasswordUserException() {
  5 + super();
  6 + }
  7 +}
codigos/backend/src/main/java/com/srh/api/error/handler/FormHandler.java
@@ -19,7 +19,7 @@ public class FormHandler { @@ -19,7 +19,7 @@ public class FormHandler {
19 @Autowired 19 @Autowired
20 private MessageSource messageSource; 20 private MessageSource messageSource;
21 21
22 - @ResponseStatus(code = HttpStatus.BAD_REQUEST) 22 + @ResponseStatus(code = HttpStatus.UNPROCESSABLE_ENTITY)
23 @ExceptionHandler(MethodArgumentNotValidException.class) 23 @ExceptionHandler(MethodArgumentNotValidException.class)
24 public List<FormErrorDto> handle(MethodArgumentNotValidException exception) { 24 public List<FormErrorDto> handle(MethodArgumentNotValidException exception) {
25 List<FormErrorDto> dtos = new ArrayList<>(); 25 List<FormErrorDto> dtos = new ArrayList<>();
codigos/backend/src/main/java/com/srh/api/error/handler/InvaliLoginUserHandler.java 0 → 100644
@@ -0,0 +1,20 @@ @@ -0,0 +1,20 @@
  1 +package com.srh.api.error.handler;
  2 +
  3 +import com.srh.api.dto.error.DefaultErrorDto;
  4 +import com.srh.api.error.exception.InvalidLoginUserException;
  5 +import org.springframework.http.HttpStatus;
  6 +import org.springframework.web.bind.annotation.ExceptionHandler;
  7 +import org.springframework.web.bind.annotation.ResponseStatus;
  8 +import org.springframework.web.bind.annotation.RestControllerAdvice;
  9 +
  10 +@RestControllerAdvice
  11 +public class InvaliLoginUserHandler {
  12 + @ResponseStatus(HttpStatus.BAD_REQUEST)
  13 + @ExceptionHandler(InvalidLoginUserException.class)
  14 + public DefaultErrorDto handle(Exception exception) {
  15 + return new DefaultErrorDto(
  16 + "Login inválido",
  17 + "O login informado não foi encontrado no sistema"
  18 + );
  19 + }
  20 +}
codigos/backend/src/main/java/com/srh/api/error/handler/InvalidAlgorithmRecommendationHandler.java 0 → 100644
@@ -0,0 +1,20 @@ @@ -0,0 +1,20 @@
  1 +package com.srh.api.error.handler;
  2 +
  3 +import com.srh.api.dto.error.DefaultErrorDto;
  4 +import com.srh.api.error.exception.InvalidAlgorithmRecommendationException;
  5 +import org.springframework.http.HttpStatus;
  6 +import org.springframework.web.bind.annotation.ExceptionHandler;
  7 +import org.springframework.web.bind.annotation.ResponseStatus;
  8 +import org.springframework.web.bind.annotation.RestControllerAdvice;
  9 +
  10 +@RestControllerAdvice
  11 +public class InvalidAlgorithmRecommendationHandler {
  12 + @ResponseStatus(HttpStatus.BAD_REQUEST)
  13 + @ExceptionHandler(InvalidAlgorithmRecommendationException.class)
  14 + public DefaultErrorDto handle(Exception exception) {
  15 + return new DefaultErrorDto(
  16 + "Algoritmo inválido",
  17 + "O id de algoritmo enviado não foi encontrado no sistema"
  18 + );
  19 + }
  20 +}
codigos/backend/src/main/java/com/srh/api/error/handler/InvalidPasswordUserHandler.java 0 → 100644
@@ -0,0 +1,20 @@ @@ -0,0 +1,20 @@
  1 +package com.srh.api.error.handler;
  2 +
  3 +import com.srh.api.dto.error.DefaultErrorDto;
  4 +import com.srh.api.error.exception.InvalidPasswordUserException;
  5 +import org.springframework.http.HttpStatus;
  6 +import org.springframework.web.bind.annotation.ExceptionHandler;
  7 +import org.springframework.web.bind.annotation.ResponseStatus;
  8 +import org.springframework.web.bind.annotation.RestControllerAdvice;
  9 +
  10 +@RestControllerAdvice
  11 +public class InvalidPasswordUserHandler {
  12 + @ResponseStatus(HttpStatus.BAD_REQUEST)
  13 + @ExceptionHandler(InvalidPasswordUserException.class)
  14 + public DefaultErrorDto handle(Exception exception) {
  15 + return new DefaultErrorDto(
  16 + "A senha informada está incorreta",
  17 + "Informe a senha correta do usuário"
  18 + );
  19 + }
  20 +}
codigos/backend/src/main/java/com/srh/api/model/Project.java
@@ -17,6 +17,7 @@ public class Project { @@ -17,6 +17,7 @@ public class Project {
17 private String description; 17 private String description;
18 private LocalDate date; 18 private LocalDate date;
19 private Boolean visible; 19 private Boolean visible;
  20 + private Integer lastMatrixId;
20 21
21 @Enumerated(EnumType.STRING) 22 @Enumerated(EnumType.STRING)
22 private Situations situation; 23 private Situations situation;
codigos/backend/src/main/java/com/srh/api/model/Recommendation.java
@@ -16,6 +16,7 @@ public class Recommendation { @@ -16,6 +16,7 @@ public class Recommendation {
16 private Double weight; 16 private Double weight;
17 private LocalDateTime date; 17 private LocalDateTime date;
18 private Integer runtimeInSeconds; 18 private Integer runtimeInSeconds;
  19 + private Integer matrixId;
19 20
20 @ManyToOne 21 @ManyToOne
21 private Algorithm algorithm; 22 private Algorithm algorithm;
codigos/backend/src/main/java/com/srh/api/model/TypeItem.java
@@ -12,6 +12,7 @@ public class TypeItem { @@ -12,6 +12,7 @@ public class TypeItem {
12 @GeneratedValue(strategy = GenerationType.IDENTITY) 12 @GeneratedValue(strategy = GenerationType.IDENTITY)
13 private Integer id; 13 private Integer id;
14 14
  15 + @Column(unique = true)
15 private String name; 16 private String name;
16 17
17 @OneToMany(mappedBy = "typeItem") 18 @OneToMany(mappedBy = "typeItem")
codigos/backend/src/main/java/com/srh/api/repository/AdminRepository.java
@@ -3,5 +3,8 @@ package com.srh.api.repository; @@ -3,5 +3,8 @@ package com.srh.api.repository;
3 import com.srh.api.model.Admin; 3 import com.srh.api.model.Admin;
4 import org.springframework.data.repository.PagingAndSortingRepository; 4 import org.springframework.data.repository.PagingAndSortingRepository;
5 5
  6 +import java.util.Optional;
  7 +
6 public interface AdminRepository extends PagingAndSortingRepository<Admin, Integer> { 8 public interface AdminRepository extends PagingAndSortingRepository<Admin, Integer> {
  9 + Optional<Admin> findByLogin(String login);
7 } 10 }
codigos/backend/src/main/java/com/srh/api/repository/EvaluatorRepository.java
@@ -3,5 +3,8 @@ package com.srh.api.repository; @@ -3,5 +3,8 @@ package com.srh.api.repository;
3 import com.srh.api.model.Evaluator; 3 import com.srh.api.model.Evaluator;
4 import org.springframework.data.repository.PagingAndSortingRepository; 4 import org.springframework.data.repository.PagingAndSortingRepository;
5 5
  6 +import java.util.Optional;
  7 +
6 public interface EvaluatorRepository extends PagingAndSortingRepository<Evaluator, Integer> { 8 public interface EvaluatorRepository extends PagingAndSortingRepository<Evaluator, Integer> {
  9 + Optional<Evaluator> findByLogin(String login);
7 } 10 }
codigos/backend/src/main/java/com/srh/api/repository/ItemRepository.java
1 package com.srh.api.repository; 1 package com.srh.api.repository;
2 2
3 import com.srh.api.model.Item; 3 import com.srh.api.model.Item;
  4 +import com.srh.api.model.Project;
4 import org.springframework.data.repository.PagingAndSortingRepository; 5 import org.springframework.data.repository.PagingAndSortingRepository;
5 6
  7 +import java.util.List;
  8 +
6 public interface ItemRepository extends PagingAndSortingRepository<Item, Integer> { 9 public interface ItemRepository extends PagingAndSortingRepository<Item, Integer> {
  10 + List<Item> findByProject(Project project);
7 } 11 }
codigos/backend/src/main/java/com/srh/api/service/AdminService.java
1 package com.srh.api.service; 1 package com.srh.api.service;
2 2
3 import com.srh.api.model.Admin; 3 import com.srh.api.model.Admin;
  4 +import com.srh.api.model.Project;
4 import com.srh.api.repository.AdminRepository; 5 import com.srh.api.repository.AdminRepository;
5 import com.srh.api.utils.PasswordUtil; 6 import com.srh.api.utils.PasswordUtil;
6 import lombok.SneakyThrows; 7 import lombok.SneakyThrows;
@@ -10,6 +11,7 @@ import org.springframework.data.domain.Page; @@ -10,6 +11,7 @@ import org.springframework.data.domain.Page;
10 import org.springframework.data.domain.Pageable; 11 import org.springframework.data.domain.Pageable;
11 import org.springframework.stereotype.Service; 12 import org.springframework.stereotype.Service;
12 13
  14 +import java.util.List;
13 import java.util.Optional; 15 import java.util.Optional;
14 16
15 @Service 17 @Service
@@ -49,4 +51,19 @@ public class AdminService { @@ -49,4 +51,19 @@ public class AdminService {
49 find(id); 51 find(id);
50 adminRepository.deleteById(id); 52 adminRepository.deleteById(id);
51 } 53 }
  54 +
  55 + public Admin findByLogin(String login) {
  56 + Optional<Admin> admin = adminRepository.findByLogin(login);
  57 +
  58 + if (admin.isPresent())
  59 + return admin.get();
  60 +
  61 + throw new ObjectNotFoundException(login, Admin.class.getName());
  62 + }
  63 +
  64 + public List<Project> listProjectsByAdmin(Integer adminId) {
  65 + Admin admin = find(adminId);
  66 + List<Project> projects = admin.getProjects();
  67 + return projects;
  68 + }
52 } 69 }
codigos/backend/src/main/java/com/srh/api/service/EvaluatorService.java
@@ -9,6 +9,7 @@ import org.springframework.data.domain.Page; @@ -9,6 +9,7 @@ import org.springframework.data.domain.Page;
9 import org.springframework.data.domain.Pageable; 9 import org.springframework.data.domain.Pageable;
10 import org.springframework.stereotype.Service; 10 import org.springframework.stereotype.Service;
11 11
  12 +import java.util.List;
12 import java.util.Optional; 13 import java.util.Optional;
13 14
14 @Service 15 @Service
@@ -31,6 +32,10 @@ public class EvaluatorService { @@ -31,6 +32,10 @@ public class EvaluatorService {
31 return evaluatorRepository.findAll(pageInfo); 32 return evaluatorRepository.findAll(pageInfo);
32 } 33 }
33 34
  35 + public Iterable<Evaluator> listAll() {
  36 + return evaluatorRepository.findAll();
  37 + }
  38 +
34 public Evaluator save(Evaluator evaluator) { 39 public Evaluator save(Evaluator evaluator) {
35 Evaluator evaluatorEncoded = passwordUtil.encodedPasswordForUser(evaluator); 40 Evaluator evaluatorEncoded = passwordUtil.encodedPasswordForUser(evaluator);
36 return evaluatorRepository.save(evaluatorEncoded); 41 return evaluatorRepository.save(evaluatorEncoded);
@@ -52,4 +57,13 @@ public class EvaluatorService { @@ -52,4 +57,13 @@ public class EvaluatorService {
52 find(id); 57 find(id);
53 evaluatorRepository.deleteById(id); 58 evaluatorRepository.deleteById(id);
54 } 59 }
  60 +
  61 + public Evaluator findByLogin(String login) {
  62 + Optional<Evaluator> evaluator = evaluatorRepository.findByLogin(login);
  63 +
  64 + if (evaluator.isPresent())
  65 + return evaluator.get();
  66 +
  67 + throw new ObjectNotFoundException(login, Evaluator.class.getName());
  68 + }
55 } 69 }
codigos/backend/src/main/java/com/srh/api/service/ItemService.java
@@ -37,7 +37,12 @@ public class ItemService { @@ -37,7 +37,12 @@ public class ItemService {
37 return itemRepository.findAll(pageInfo); 37 return itemRepository.findAll(pageInfo);
38 } 38 }
39 39
  40 + @SneakyThrows
40 public Item save(Item item) { 41 public Item save(Item item) {
  42 + if (!itemProjectIsOpenAndVisible(item)) {
  43 + throw new ProjectNotOpenedException("The project is closed or invisible");
  44 + }
  45 +
41 return itemRepository.save(item); 46 return itemRepository.save(item);
42 } 47 }
43 48
codigos/backend/src/main/java/com/srh/api/service/LoginClientDto.java 0 → 100644
@@ -0,0 +1,11 @@ @@ -0,0 +1,11 @@
  1 +package com.srh.api.service;
  2 +
  3 +import lombok.AllArgsConstructor;
  4 +import lombok.Getter;
  5 +
  6 +@Getter
  7 +@AllArgsConstructor
  8 +public class LoginClientDto {
  9 + private final Boolean validUser;
  10 + private Integer userId;
  11 +}
codigos/backend/src/main/java/com/srh/api/service/LoginClientService.java 0 → 100644
@@ -0,0 +1,77 @@ @@ -0,0 +1,77 @@
  1 +package com.srh.api.service;
  2 +
  3 +import com.srh.api.error.exception.InvalidLoginUserException;
  4 +import com.srh.api.error.exception.InvalidPasswordUserException;
  5 +import com.srh.api.model.Admin;
  6 +import com.srh.api.model.Evaluator;
  7 +import com.srh.api.utils.PasswordUtil;
  8 +import lombok.SneakyThrows;
  9 +import org.hibernate.ObjectNotFoundException;
  10 +import org.springframework.beans.factory.annotation.Autowired;
  11 +import org.springframework.stereotype.Service;
  12 +
  13 +@Service
  14 +public class LoginClientService {
  15 + @Autowired
  16 + EvaluatorService evaluatorService;
  17 +
  18 + @Autowired
  19 + AdminService adminService;
  20 +
  21 + PasswordUtil<Evaluator> passwordUtilEvaluator = new PasswordUtil<>();
  22 + PasswordUtil<Admin> passwordUtilAdmin = new PasswordUtil<>();
  23 +
  24 + @SneakyThrows
  25 + public Boolean verifyEvaluators(String login, String rawPassword) {
  26 + Evaluator evaluator;
  27 +
  28 + try {
  29 + evaluator = evaluatorService.findByLogin(login);
  30 + } catch (ObjectNotFoundException e) {
  31 + throw new InvalidLoginUserException();
  32 + }
  33 +
  34 + if (!passwordUtilEvaluator.isEqualsPasswords(rawPassword, evaluator.getPassword())) {
  35 + throw new InvalidPasswordUserException();
  36 + }
  37 +
  38 + return true;
  39 + }
  40 +
  41 + @SneakyThrows
  42 + public Boolean generateLoginTokenByAdmins(String login, String rawPassword) {
  43 + Admin admin;
  44 +
  45 + try {
  46 + admin = adminService.findByLogin(login);
  47 + } catch (ObjectNotFoundException e) {
  48 + throw new InvalidLoginUserException();
  49 + }
  50 +
  51 + if (!passwordUtilEvaluator.isEqualsPasswords(rawPassword, admin.getPassword())) {
  52 + throw new InvalidPasswordUserException();
  53 + }
  54 +
  55 + return true;
  56 + }
  57 +
  58 + @SneakyThrows
  59 + public Integer getAdminId(String login) {
  60 + try {
  61 + Admin admin = adminService.findByLogin(login);
  62 + return admin.getId();
  63 + } catch (ObjectNotFoundException e) {
  64 + throw new InvalidLoginUserException();
  65 + }
  66 + }
  67 +
  68 + @SneakyThrows
  69 + public Integer getEvaluatorId(String login) {
  70 + try {
  71 + Evaluator evaluator = evaluatorService.findByLogin(login);
  72 + return evaluator.getId();
  73 + } catch (ObjectNotFoundException e) {
  74 + throw new InvalidLoginUserException();
  75 + }
  76 + }
  77 +}
codigos/backend/src/main/java/com/srh/api/service/ProjectService.java
1 package com.srh.api.service; 1 package com.srh.api.service;
2 2
3 import com.srh.api.error.exception.ChangeRootRelationException; 3 import com.srh.api.error.exception.ChangeRootRelationException;
4 -import com.srh.api.model.Admin;  
5 -import com.srh.api.model.Project; 4 +import com.srh.api.model.*;
6 import com.srh.api.repository.ProjectRepository; 5 import com.srh.api.repository.ProjectRepository;
7 import lombok.SneakyThrows; 6 import lombok.SneakyThrows;
8 import org.hibernate.ObjectNotFoundException; 7 import org.hibernate.ObjectNotFoundException;
@@ -11,6 +10,8 @@ import org.springframework.data.domain.Page; @@ -11,6 +10,8 @@ import org.springframework.data.domain.Page;
11 import org.springframework.data.domain.Pageable; 10 import org.springframework.data.domain.Pageable;
12 import org.springframework.stereotype.Service; 11 import org.springframework.stereotype.Service;
13 12
  13 +import java.util.ArrayList;
  14 +import java.util.List;
14 import java.util.Optional; 15 import java.util.Optional;
15 16
16 @Service 17 @Service
@@ -57,4 +58,55 @@ public class ProjectService { @@ -57,4 +58,55 @@ public class ProjectService {
57 find(id); 58 find(id);
58 projectRepository.deleteById(id); 59 projectRepository.deleteById(id);
59 } 60 }
  61 +
  62 + public List<Item> listItensByProject(Integer projectId) {
  63 + Project project = find(projectId);
  64 + return project.getItens();
  65 + }
  66 +
  67 + public List<Recommendation> listRecommendationsByProject(Integer projectId) {
  68 + List<Item> itens = listItensByProject(projectId);
  69 + List<Recommendation> recommendations = new ArrayList<>();
  70 +
  71 + for (Item item : itens) {
  72 + recommendations.addAll(item.getRecommendations());
  73 + }
  74 +
  75 + return recommendations;
  76 + }
  77 +
  78 + public List<ItemRating> listItemRatingsByProject(Integer projectId) {
  79 + List<Item> itens = listItensByProject(projectId);
  80 + List<ItemRating> itemRatings = new ArrayList<>();
  81 +
  82 + for (Item item : itens) {
  83 + itemRatings.addAll(item.getItemRatings());
  84 + }
  85 +
  86 + return itemRatings;
  87 + }
  88 +
  89 + public List<Tag> listTagsByProject(Integer projectId) {
  90 + List<Item> itens = listItensByProject(projectId);
  91 + List<Tag> tags = new ArrayList<>();
  92 +
  93 + for (Item item : itens) {
  94 + tags.addAll(item.getTags());
  95 + }
  96 +
  97 + return tags;
  98 + }
  99 +
  100 + public List<TypeItem> listTypeItensByProject(Integer projectId) {
  101 + List<Item> itens = listItensByProject(projectId);
  102 + List<TypeItem> typeItems = new ArrayList<>();
  103 +
  104 + for (Item item : itens) {
  105 + if (item.getTypeItem() != null) {
  106 + typeItems.add(item.getTypeItem());
  107 + }
  108 + }
  109 +
  110 + return typeItems;
  111 + }
60 } 112 }
codigos/backend/src/main/java/com/srh/api/service/RecommendationService.java
1 package com.srh.api.service; 1 package com.srh.api.service;
2 2
  3 +import com.srh.api.algorithms.AlgorithmCalc;
  4 +import com.srh.api.algorithms.AlgorithmStrategy;
  5 +import com.srh.api.algorithms.structure.RecommendationsByUser;
  6 +import com.srh.api.dto.resource.RecommendationForm;
  7 +import com.srh.api.model.Evaluator;
3 import com.srh.api.model.Recommendation; 8 import com.srh.api.model.Recommendation;
4 import com.srh.api.repository.RecommendationRepository; 9 import com.srh.api.repository.RecommendationRepository;
5 import org.hibernate.ObjectNotFoundException; 10 import org.hibernate.ObjectNotFoundException;
@@ -8,6 +13,8 @@ import org.springframework.data.domain.Page; @@ -8,6 +13,8 @@ import org.springframework.data.domain.Page;
8 import org.springframework.data.domain.Pageable; 13 import org.springframework.data.domain.Pageable;
9 import org.springframework.stereotype.Service; 14 import org.springframework.stereotype.Service;
10 15
  16 +import java.util.ArrayList;
  17 +import java.util.List;
11 import java.util.Optional; 18 import java.util.Optional;
12 19
13 @Service 20 @Service
@@ -41,4 +48,9 @@ public class RecommendationService { @@ -41,4 +48,9 @@ public class RecommendationService {
41 find(id); 48 find(id);
42 recommendationRepository.deleteById(id); 49 recommendationRepository.deleteById(id);
43 } 50 }
  51 +
  52 + public List<RecommendationsByUser> generateRecommendation(RecommendationForm recommendationInfo) {
  53 + AlgorithmCalc algorithm = AlgorithmStrategy.findInstance(recommendationInfo.getAlgorithmId());
  54 + return algorithm.calc(recommendationInfo);
  55 + }
44 } 56 }
codigos/backend/src/main/java/com/srh/api/utils/PasswordUtil.java
@@ -23,6 +23,10 @@ public class PasswordUtil&lt;T extends User&gt; { @@ -23,6 +23,10 @@ public class PasswordUtil&lt;T extends User&gt; {
23 return encodedPasswordForUser(newUser, newRawPassword); 23 return encodedPasswordForUser(newUser, newRawPassword);
24 } 24 }
25 25
  26 + public boolean isEqualsPasswords(String rawPassword, String encodedPassword) {
  27 + return BcriptyUtil.compareValues(rawPassword, encodedPassword);
  28 + }
  29 +
26 private T encodedPasswordForUser(T user, String newRawPassword) { 30 private T encodedPasswordForUser(T user, String newRawPassword) {
27 String encodedPassword = BcriptyUtil.encripty(newRawPassword); 31 String encodedPassword = BcriptyUtil.encripty(newRawPassword);
28 user.setPassword(encodedPassword); 32 user.setPassword(encodedPassword);
@@ -40,8 +44,4 @@ public class PasswordUtil&lt;T extends User&gt; { @@ -40,8 +44,4 @@ public class PasswordUtil&lt;T extends User&gt; {
40 throw new NotEqualsPasswordException("A senha antiga não confere com a cadastrada"); 44 throw new NotEqualsPasswordException("A senha antiga não confere com a cadastrada");
41 } 45 }
42 } 46 }
43 -  
44 - private boolean isEqualsPasswords(String rawPassword, String encodedPassword) {  
45 - return BcriptyUtil.compareValues(rawPassword, encodedPassword);  
46 - }  
47 } 47 }
codigos/backend/src/main/resources/application.properties
1 # Profile 1 # Profile
2 -spring.profiles.active=test 2 +spring.profiles.active=dev
3 3
4 # jwt 4 # jwt
5 -srh.jwt.secret=A+X;fTJP&Pd,TD9dwVq(hsHX,ya^<wsD_UK7L+@=S;{'CydP]{v@}G'b>et;yz$*\yL5S8EJN:%P:X%H9>#nYLrX}@\s?CQcpspH,2emzBc!Q[V'AYa~uzF8WR~AUrMzxp/V$9([S9X#zj/CH('#]B_Hc+%fGhe27YB;^j4\Xk=Ju"Ap~_&<L;=!Z;!,2UP;!hF3P]j85#*`&T]/kB/W^6$v~u6qpejL>kY^f)sy4:qTq_Ec!-z!@aAp~sLKGU>$ 5 +srh.jwt.secret=VGFrZSBPbiBNZSBUYWtlIE1lIE9u
6 srh.jwt.expiration=86400000 6 srh.jwt.expiration=86400000
7 7
8 # actuator 8 # actuator
@@ -14,3 +14,10 @@ info.app.version=@project.version@ @@ -14,3 +14,10 @@ info.app.version=@project.version@
14 info.app.encoding=@project.build.sourceEncoding@ 14 info.app.encoding=@project.build.sourceEncoding@
15 info.app.java.version=@java.version@ 15 info.app.java.version=@java.version@
16 16
  17 +#mail
  18 +spring.mail.host=smtp.mailtrap.io
  19 +spring.mail.port=587
  20 +spring.mail.username=f51ab4b9bfc3ec
  21 +spring.mail.password=d6a3cbd03b13ae
  22 +spring.mail.properties.mail.smtp.auth=true
  23 +spring.mail.properties.mail.smtp.starttls.enable=true
17 \ No newline at end of file 24 \ No newline at end of file
codigos/frontend/.eslintrc.js
  1 +const { resolve } = require('path');
  2 +
1 module.exports = { 3 module.exports = {
2 // https://eslint.org/docs/user-guide/configuring#configuration-cascading-and-hierarchy 4 // https://eslint.org/docs/user-guide/configuring#configuration-cascading-and-hierarchy
3 // This option interrupts the configuration hierarchy at this file 5 // This option interrupts the configuration hierarchy at this file
4 // Remove this if you have an higher level ESLint config file (it usually happens into a monorepos) 6 // Remove this if you have an higher level ESLint config file (it usually happens into a monorepos)
5 root: true, 7 root: true,
6 8
  9 + // https://eslint.vuejs.org/user-guide/#how-to-use-custom-parser
  10 + // Must use parserOptions instead of "parser" to allow vue-eslint-parser to keep working
  11 + // `parser: 'vue-eslint-parser'` is already included with any 'plugin:vue/**' config and should be omitted
7 parserOptions: { 12 parserOptions: {
8 - parser: 'babel-eslint', 13 + // https://github.com/typescript-eslint/typescript-eslint/tree/master/packages/parser#configuration
  14 + // https://github.com/TypeStrong/fork-ts-checker-webpack-plugin#eslint
  15 + // Needed to make the parser take into account 'vue' files
  16 + extraFileExtensions: ['.vue'],
  17 + parser: '@typescript-eslint/parser',
  18 + project: resolve(__dirname, './tsconfig.json'),
  19 + tsconfigRootDir: __dirname,
9 ecmaVersion: 2018, // Allows for the parsing of modern ECMAScript features 20 ecmaVersion: 2018, // Allows for the parsing of modern ECMAScript features
10 - sourceType: 'module' // Allows for the use of imports  
11 - },  
12 -  
13 - env: {  
14 - browser: true 21 + sourceType: 'module', // Allows for the use of imports
15 }, 22 },
16 23
17 // Rules order is important, please avoid shuffling them 24 // Rules order is important, please avoid shuffling them
18 extends: [ 25 extends: [
19 // Base ESLint recommended rules 26 // Base ESLint recommended rules
20 - // 'eslint:recommended', 27 + 'eslint:recommended',
21 28
  29 + // https://github.com/typescript-eslint/typescript-eslint/tree/master/packages/eslint-plugin#usage
  30 + // ESLint typescript rules
  31 + 'plugin:@typescript-eslint/eslint-recommended',
  32 + 'plugin:@typescript-eslint/recommended',
  33 + // consider disabling this class of rules if linting takes too long
  34 + 'plugin:@typescript-eslint/recommended-requiring-type-checking',
22 35
23 - // Uncomment any of the lines below to choose desired strictness,  
24 - // but leave only one uncommented!  
25 - // See https://eslint.vuejs.org/rules/#available-rules  
26 - 'plugin:vue/essential', // Priority A: Essential (Error Prevention)  
27 - // 'plugin:vue/strongly-recommended', // Priority B: Strongly Recommended (Improving Readability)  
28 - // 'plugin:vue/recommended', // Priority C: Recommended (Minimizing Arbitrary Choices and Cognitive Overhead)  
29 -  
30 - 'standard' 36 + // https://eslint.vuejs.org/rules/#priority-a-essential-error-prevention
  37 + // consider switching to `plugin:vue/strongly-recommended` or `plugin:vue/recommended` for stricter rules
  38 + 'plugin:vue/essential',
31 39
  40 + // --- ONLY WHEN USING PRETTIER ---
  41 + // https://github.com/prettier/eslint-config-prettier#installation
  42 + // usage with Prettier, provided by 'eslint-config-prettier'.
  43 + 'prettier',
  44 + 'prettier/@typescript-eslint',
  45 + 'prettier/vue',
32 ], 46 ],
33 47
34 plugins: [ 48 plugins: [
  49 + // required to apply rules which need type information
  50 + '@typescript-eslint',
  51 +
35 // https://eslint.vuejs.org/user-guide/#why-doesn-t-it-work-on-vue-file 52 // https://eslint.vuejs.org/user-guide/#why-doesn-t-it-work-on-vue-file
36 // required to lint *.vue files 53 // required to lint *.vue files
37 'vue', 54 'vue',
38 -  
39 ], 55 ],
40 56
41 - globals: {  
42 - ga: true, // Google Analytics  
43 - cordova: true,  
44 - __statics: true,  
45 - process: true,  
46 - Capacitor: true,  
47 - chrome: true  
48 - },  
49 -  
50 // add your custom rules here 57 // add your custom rules here
51 rules: { 58 rules: {
52 - // allow async-await  
53 - 'generator-star-spacing': 'off',  
54 - // allow paren-less arrow functions  
55 - 'arrow-parens': 'off',  
56 - 'one-var': 'off',  
57 -  
58 - 'import/first': 'off',  
59 - 'import/named': 'error',  
60 - 'import/namespace': 'error',  
61 - 'import/default': 'error',  
62 - 'import/export': 'error',  
63 - 'import/extensions': 'off',  
64 - 'import/no-unresolved': 'off',  
65 - 'import/no-extraneous-dependencies': 'off',  
66 - 'prefer-promise-reject-errors': 'off',  
67 - 59 + // others rules...
68 60
69 - // allow debugger during development only  
70 - 'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off' 61 + // TypeScript
  62 + 'quotes': ['warn', 'single'],
  63 + '@typescript-eslint/explicit-function-return-type': 'off',
71 } 64 }
72 } 65 }
codigos/frontend/.vscode/settings.json
@@ -2,6 +2,6 @@ @@ -2,6 +2,6 @@
2 "vetur.validation.template": false, 2 "vetur.validation.template": false,
3 "vetur.format.enable": false, 3 "vetur.format.enable": false,
4 "eslint.validate": ["javascript", "javascriptreact", "typescript", "vue"], 4 "eslint.validate": ["javascript", "javascriptreact", "typescript", "vue"],
5 - 5 + "typescript.tsdk": "node_modules/typescript/lib",
6 "vetur.experimental.templateInterpolationService": true 6 "vetur.experimental.templateInterpolationService": true
7 } 7 }
codigos/frontend/README.md
1 -# SRH Frontend Admin (srh-frontend-admin) 1 +# SRH Admin Client (srh-admin-client)
2 2
3 -A admin client from System Recommendation Hybrid 3 +A client for SRH
4 4
5 ## Install the dependencies 5 ## Install the dependencies
6 ```bash 6 ```bash
codigos/frontend/babel.config.js
1 - 1 +/* eslint-env node */
2 module.exports = { 2 module.exports = {
3 presets: [ 3 presets: [
4 - '@quasar/babel-preset-app'  
5 - ]  
6 -} 4 + '@quasar/babel-preset-app',
  5 + ],
  6 +};
codigos/frontend/package.json
1 { 1 {
2 - "name": "srh-frontend-admin", 2 + "name": "srh-admin-client",
3 "version": "0.0.1", 3 "version": "0.0.1",
4 - "description": "A admin client from System Recommendation Hybrid",  
5 - "productName": "SRH Frontend Admin", 4 + "description": "A client for SRH",
  5 + "productName": "SRH Admin Client",
6 "author": "Herik dos Santos Lorenção <heriksantoslorencao@gmail.com>", 6 "author": "Herik dos Santos Lorenção <heriksantoslorencao@gmail.com>",
7 "private": true, 7 "private": true,
8 "scripts": { 8 "scripts": {
9 "lint": "eslint --ext .js,.vue ./", 9 "lint": "eslint --ext .js,.vue ./",
10 "test": "echo \"No test specified\" && exit 0", 10 "test": "echo \"No test specified\" && exit 0",
11 - "dev": "quasar dev --port 3000", 11 + "dev": "quasar dev",
12 "build": "quasar build", 12 "build": "quasar build",
13 "build:pwa": "quasar build -m pwa" 13 "build:pwa": "quasar build -m pwa"
14 }, 14 },
15 "dependencies": { 15 "dependencies": {
16 "@quasar/extras": "^1.0.0", 16 "@quasar/extras": "^1.0.0",
17 - "axios": "^0.18.1", 17 + "@types/jsonwebtoken": "^8.5.0",
  18 + "axios": "^0.19.2",
  19 + "chart.js": "^2.9.3",
18 "core-js": "^3.6.5", 20 "core-js": "^3.6.5",
  21 + "jsonwebtoken": "^8.5.1",
19 "quasar": "^1.0.0", 22 "quasar": "^1.0.0",
20 - "vue-mc": "^0.6.0" 23 + "vue-chartjs": "^3.5.0",
  24 + "vue-class-component": "^7.2.2",
  25 + "vue-property-decorator": "^8.3.0"
21 }, 26 },
22 "devDependencies": { 27 "devDependencies": {
23 "@quasar/app": "^2.0.0", 28 "@quasar/app": "^2.0.0",
  29 + "@types/node": "^10.17.15",
  30 + "@typescript-eslint/eslint-plugin": "^3.3.0",
  31 + "@typescript-eslint/parser": "^3.3.0",
24 "babel-eslint": "^10.0.1", 32 "babel-eslint": "^10.0.1",
25 "eslint": "^6.8.0", 33 "eslint": "^6.8.0",
26 - "eslint-config-standard": "^14.1.0", 34 + "eslint-config-airbnb-base": "^14.0.0",
27 "eslint-loader": "^3.0.3", 35 "eslint-loader": "^3.0.3",
28 - "eslint-plugin-import": "^2.14.0",  
29 - "eslint-plugin-node": "^11.0.0",  
30 - "eslint-plugin-promise": "^4.0.1",  
31 - "eslint-plugin-standard": "^4.0.0", 36 + "eslint-plugin-import": "^2.20.1",
32 "eslint-plugin-vue": "^6.1.2" 37 "eslint-plugin-vue": "^6.1.2"
33 }, 38 },
34 "browserslist": [ 39 "browserslist": [
codigos/frontend/quasar.conf.js
@@ -6,190 +6,206 @@ @@ -6,190 +6,206 @@
6 // Configuration for your app 6 // Configuration for your app
7 // https://quasar.dev/quasar-cli/quasar-conf-js 7 // https://quasar.dev/quasar-cli/quasar-conf-js
8 /* eslint-env node */ 8 /* eslint-env node */
9 -  
10 -module.exports = function (/* ctx */) {  
11 - return {  
12 - // https://quasar.dev/quasar-cli/supporting-ts  
13 - supportTS: false,  
14 -  
15 - // https://quasar.dev/quasar-cli/prefetch-feature  
16 - // preFetch: true,  
17 -  
18 - // app boot file (/src/boot)  
19 - // --> boot files are part of "main.js"  
20 - // https://quasar.dev/quasar-cli/boot-files  
21 - boot: [  
22 -  
23 - 'axios'  
24 - ],  
25 -  
26 - // https://quasar.dev/quasar-cli/quasar-conf-js#Property%3A-css  
27 - css: [  
28 - 'app.scss'  
29 - ],  
30 -  
31 - // https://github.com/quasarframework/quasar/tree/dev/extras  
32 - extras: [  
33 - // 'ionicons-v4',  
34 - // 'mdi-v5',  
35 - // 'fontawesome-v5',  
36 - // 'eva-icons',  
37 - // 'themify',  
38 - // 'line-awesome',  
39 - // 'roboto-font-latin-ext', // this or either 'roboto-font', NEVER both!  
40 -  
41 - 'roboto-font', // optional, you are not bound to it  
42 - 'material-icons' // optional, you are not bound to it  
43 - ],  
44 -  
45 - // Full list of options: https://quasar.dev/quasar-cli/quasar-conf-js#Property%3A-build  
46 - build: {  
47 - vueRouterMode: 'hash', // available values: 'hash', 'history'  
48 -  
49 - // transpile: false,  
50 -  
51 - // Add dependencies for transpiling with Babel (Array of string/regex)  
52 - // (from node_modules, which are by default not transpiled).  
53 - // Applies only if "transpile" is set to true.  
54 - // transpileDependencies: [],  
55 -  
56 - // rtl: false, // https://quasar.dev/options/rtl-support  
57 - // preloadChunks: true,  
58 - // showProgress: false,  
59 - // gzip: true,  
60 - // analyze: true,  
61 -  
62 - // Options below are automatically set depending on the env, set them if you want to override  
63 - // extractCSS: false,  
64 -  
65 - // https://quasar.dev/quasar-cli/handling-webpack  
66 - extendWebpack (cfg) { 9 +/* eslint func-names: 0 */
  10 +/* eslint global-require: 0 */
  11 +/* eslint-disable @typescript-eslint/no-var-requires */
  12 +const { configure } = require('quasar/wrappers');
  13 +
  14 +module.exports = configure((ctx) => ({
  15 + // https://quasar.dev/quasar-cli/supporting-ts
  16 + supportTS: {
  17 + tsCheckerConfig: {
  18 + eslint: true,
  19 + },
  20 + },
  21 +
  22 + // https://quasar.dev/quasar-cli/prefetch-feature
  23 + // preFetch: true,
  24 +
  25 + // app boot file (/src/boot)
  26 + // --> boot files are part of "main.js"
  27 + // https://quasar.dev/quasar-cli/boot-files
  28 + boot: [
  29 + 'loginRouteGuard', 'loginAdminRouteGuard'
  30 + ],
  31 +
  32 + // https://quasar.dev/quasar-cli/quasar-conf-js#Property%3A-css
  33 + css: [
  34 + 'app.scss',
  35 + ],
  36 +
  37 + // https://github.com/quasarframework/quasar/tree/dev/extras
  38 + extras: [
  39 + // 'ionicons-v4',
  40 + // 'mdi-v5',
  41 + 'fontawesome-v5',
  42 + // 'eva-icons',
  43 + // 'themify',
  44 + // 'line-awesome',
  45 + // 'roboto-font-latin-ext', // this or either 'roboto-font', NEVER both!
  46 +
  47 + 'roboto-font', // optional, you are not bound to it
  48 + 'material-icons', // optional, you are not bound to it
  49 + ],
  50 +
  51 + // Full list of options: https://quasar.dev/quasar-cli/quasar-conf-js#Property%3A-build
  52 + build: {
  53 + vueRouterMode: 'history', // available values: 'hash', 'history'
  54 +
  55 + // transpile: false,
  56 +
  57 + // Add dependencies for transpiling with Babel (Array of string/regex)
  58 + // (from node_modules, which are by default not transpiled).
  59 + // Applies only if "transpile" is set to true.
  60 + // transpileDependencies: [],
  61 +
  62 + // rtl: false, // https://quasar.dev/options/rtl-support
  63 + // preloadChunks: true,
  64 + // showProgress: false,
  65 + // gzip: true,
  66 + // analyze: true,
  67 +
  68 + // Options below are automatically set depending on the env, set them if you want to override
  69 + // extractCSS: false,
  70 +
  71 + // https://quasar.dev/quasar-cli/handling-webpack
  72 + extendWebpack(cfg) {
  73 + // linting is slow in TS projects, we execute it only for production builds
  74 + if (ctx.prod) {
67 cfg.module.rules.push({ 75 cfg.module.rules.push({
68 enforce: 'pre', 76 enforce: 'pre',
69 test: /\.(js|vue)$/, 77 test: /\.(js|vue)$/,
70 loader: 'eslint-loader', 78 loader: 'eslint-loader',
71 - exclude: /node_modules/  
72 - }) 79 + exclude: /node_modules/,
  80 + });
73 } 81 }
74 }, 82 },
  83 + },
75 84
76 - // Full list of options: https://quasar.dev/quasar-cli/quasar-conf-js#Property%3A-devServer  
77 - devServer: {  
78 - https: false,  
79 - port: 8080,  
80 - open: true // opens browser window automatically  
81 - }, 85 + // Full list of options: https://quasar.dev/quasar-cli/quasar-conf-js#Property%3A-devServer
  86 + devServer: {
  87 + https: false,
  88 + port: 8080,
  89 + open: true, // opens browser window automatically
  90 + },
82 91
83 - // https://quasar.dev/quasar-cli/quasar-conf-js#Property%3A-framework  
84 - framework: {  
85 - iconSet: 'material-icons', // Quasar icon set  
86 - lang: 'en-us', // Quasar language pack  
87 - config: {  
88 - notify: {}  
89 - },  
90 -  
91 - // Possible values for "importStrategy":  
92 - // * 'auto' - (DEFAULT) Auto-import needed Quasar components & directives  
93 - // * 'all' - Manually specify what to import  
94 - importStrategy: 'auto',  
95 -  
96 - // Quasar plugins  
97 - plugins: [  
98 - 'Notify'  
99 - ]  
100 - }, 92 + // https://quasar.dev/quasar-cli/quasar-conf-js#Property%3A-framework
  93 + framework: {
  94 + iconSet: 'material-icons', // Quasar icon set
  95 + lang: 'en-us', // Quasar language pack
  96 + config: {
101 97
102 - // animations: 'all', // --- includes all animations  
103 - // https://quasar.dev/options/animations  
104 - animations: [],  
105 -  
106 - // https://quasar.dev/quasar-cli/developing-ssr/configuring-ssr  
107 - ssr: {  
108 - pwa: false  
109 }, 98 },
110 99
111 - // https://quasar.dev/quasar-cli/developing-pwa/configuring-pwa  
112 - pwa: {  
113 - workboxPluginMode: 'GenerateSW', // 'GenerateSW' or 'InjectManifest'  
114 - workboxOptions: {}, // only for GenerateSW  
115 - manifest: {  
116 - name: 'SRH Frontend Admin',  
117 - short_name: 'SRH Frontend Admin',  
118 - description: 'A admin client from System Recommendation Hybrid',  
119 - display: 'standalone',  
120 - orientation: 'portrait',  
121 - background_color: '#ffffff',  
122 - theme_color: '#027be3',  
123 - icons: [  
124 - {  
125 - src: 'icons/icon-128x128.png',  
126 - sizes: '128x128',  
127 - type: 'image/png'  
128 - },  
129 - {  
130 - src: 'icons/icon-192x192.png',  
131 - sizes: '192x192',  
132 - type: 'image/png'  
133 - },  
134 - {  
135 - src: 'icons/icon-256x256.png',  
136 - sizes: '256x256',  
137 - type: 'image/png'  
138 - },  
139 - {  
140 - src: 'icons/icon-384x384.png',  
141 - sizes: '384x384',  
142 - type: 'image/png'  
143 - },  
144 - {  
145 - src: 'icons/icon-512x512.png',  
146 - sizes: '512x512',  
147 - type: 'image/png'  
148 - }  
149 - ]  
150 - } 100 + // Possible values for "importStrategy":
  101 + // * 'auto' - (DEFAULT) Auto-import needed Quasar components & directives
  102 + // * 'all' - Manually specify what to import
  103 + importStrategy: 'auto',
  104 + cssAddon: true,
  105 +
  106 + // For special cases outside of where "auto" importStrategy can have an impact
  107 + // (like functional components as one of the examples),
  108 + // you can manually specify Quasar components/directives to be available everywhere:
  109 + //
  110 + // components: [],
  111 + // directives: [],
  112 +
  113 + // Quasar plugins
  114 + plugins: [
  115 + 'Notify'
  116 + ],
  117 + },
  118 +
  119 + // animations: 'all', // --- includes all animations
  120 + // https://quasar.dev/options/animations
  121 + animations: [],
  122 +
  123 + // https://quasar.dev/quasar-cli/developing-ssr/configuring-ssr
  124 + ssr: {
  125 + pwa: false,
  126 + },
  127 +
  128 + // https://quasar.dev/quasar-cli/developing-pwa/configuring-pwa
  129 + pwa: {
  130 + workboxPluginMode: 'GenerateSW', // 'GenerateSW' or 'InjectManifest'
  131 + workboxOptions: {}, // only for GenerateSW
  132 + manifest: {
  133 + name: 'SRH Admin Client',
  134 + short_name: 'SRH Admin Client',
  135 + description: 'A client for SRH',
  136 + display: 'standalone',
  137 + orientation: 'portrait',
  138 + background_color: '#ffffff',
  139 + theme_color: '#027be3',
  140 + icons: [
  141 + {
  142 + src: 'icons/icon-128x128.png',
  143 + sizes: '128x128',
  144 + type: 'image/png',
  145 + },
  146 + {
  147 + src: 'icons/icon-192x192.png',
  148 + sizes: '192x192',
  149 + type: 'image/png',
  150 + },
  151 + {
  152 + src: 'icons/icon-256x256.png',
  153 + sizes: '256x256',
  154 + type: 'image/png',
  155 + },
  156 + {
  157 + src: 'icons/icon-384x384.png',
  158 + sizes: '384x384',
  159 + type: 'image/png',
  160 + },
  161 + {
  162 + src: 'icons/icon-512x512.png',
  163 + sizes: '512x512',
  164 + type: 'image/png',
  165 + },
  166 + ],
151 }, 167 },
  168 + },
152 169
153 - // Full list of options: https://quasar.dev/quasar-cli/developing-cordova-apps/configuring-cordova  
154 - cordova: {  
155 - // noIosLegacyBuildFlag: true, // uncomment only if you know what you are doing  
156 - }, 170 + // Full list of options: https://quasar.dev/quasar-cli/developing-cordova-apps/configuring-cordova
  171 + cordova: {
  172 + // noIosLegacyBuildFlag: true, // uncomment only if you know what you are doing
  173 + },
157 174
158 - // Full list of options: https://quasar.dev/quasar-cli/developing-capacitor-apps/configuring-capacitor  
159 - capacitor: {  
160 - hideSplashscreen: true  
161 - }, 175 + // Full list of options: https://quasar.dev/quasar-cli/developing-capacitor-apps/configuring-capacitor
  176 + capacitor: {
  177 + hideSplashscreen: true,
  178 + },
162 179
163 - // Full list of options: https://quasar.dev/quasar-cli/developing-electron-apps/configuring-electron  
164 - electron: {  
165 - bundler: 'packager', // 'packager' or 'builder' 180 + // Full list of options: https://quasar.dev/quasar-cli/developing-electron-apps/configuring-electron
  181 + electron: {
  182 + bundler: 'packager', // 'packager' or 'builder'
166 183
167 - packager: {  
168 - // https://github.com/electron-userland/electron-packager/blob/master/docs/api.md#options 184 + packager: {
  185 + // https://github.com/electron-userland/electron-packager/blob/master/docs/api.md#options
169 186
170 - // OS X / Mac App Store  
171 - // appBundleId: '',  
172 - // appCategoryType: '',  
173 - // osxSign: '',  
174 - // protocol: 'myapp://path', 187 + // OS X / Mac App Store
  188 + // appBundleId: '',
  189 + // appCategoryType: '',
  190 + // osxSign: '',
  191 + // protocol: 'myapp://path',
175 192
176 - // Windows only  
177 - // win32metadata: { ... }  
178 - }, 193 + // Windows only
  194 + // win32metadata: { ... }
  195 + },
179 196
180 - builder: {  
181 - // https://www.electron.build/configuration/configuration 197 + builder: {
  198 + // https://www.electron.build/configuration/configuration
182 199
183 - appId: 'srh-frontend-admin'  
184 - }, 200 + appId: 'srh-admin-client',
  201 + },
185 202
186 - // More info: https://quasar.dev/quasar-cli/developing-electron-apps/node-integration  
187 - nodeIntegration: true, 203 + // More info: https://quasar.dev/quasar-cli/developing-electron-apps/node-integration
  204 + nodeIntegration: true,
188 205
189 - extendWebpack (/* cfg */) {  
190 - // do something with Electron main process Webpack cfg  
191 - // chainWebpack also available besides this extendWebpack  
192 - }  
193 - }  
194 - }  
195 -} 206 + extendWebpack(/* cfg */) {
  207 + // do something with Electron main process Webpack cfg
  208 + // chainWebpack also available besides this extendWebpack
  209 + },
  210 + },
  211 +}));
codigos/frontend/src/App.vue
1 <template> 1 <template>
2 <div id="q-app"> 2 <div id="q-app">
3 - <router-view/> 3 + <router-view />
4 </div> 4 </div>
5 </template> 5 </template>
  6 +<script lang="ts">
  7 +import { Vue, Component } from 'vue-property-decorator';
6 8
7 -<script>  
8 -export default {  
9 - name: 'App'  
10 -} 9 +@Component
  10 +export default class App extends Vue {}
11 </script> 11 </script>
codigos/frontend/src/assets/ifes-logo.png 0 → 100644

68.3 KB

codigos/frontend/src/boot/loginAdminRouteGuard.js 0 → 100644
@@ -0,0 +1,24 @@ @@ -0,0 +1,24 @@
  1 +import AuthApiService from "../services/AuthApiService";
  2 +import Login from "../models/Login";
  3 +
  4 +export default async ({ router, store }) => {
  5 + router.beforeEach((to, from, next) => {
  6 + const idUsuario = store.getters['login/getIdUsuario'];
  7 +
  8 + if (idUsuario === null && to.path !== '/login') {
  9 + const authApiService = new AuthApiService();
  10 + const token = store.getters['login/getToken']
  11 +
  12 + if (authApiService.verifyToken(token)) next();
  13 +
  14 + const loginForm = new Login('admin', '123456');
  15 + authApiService.generateJwt(loginForm).then(resp => {
  16 + store.commit('login/defineToken', resp);
  17 + });
  18 +
  19 + next('/login');
  20 + }
  21 +
  22 + next();
  23 + })
  24 +}
codigos/frontend/src/boot/loginRouteGuard.js 0 → 100644
@@ -0,0 +1,18 @@ @@ -0,0 +1,18 @@
  1 +import AuthApiService from "src/services/AuthApiService";
  2 +import Login from '../models/Login';
  3 +
  4 +export default async({ router, store }) => {
  5 + router.beforeEach((to, from, next) => {
  6 + const token = store.getters['login/getToken'];
  7 + const authApiService = new AuthApiService();
  8 +
  9 + if (authApiService.verifyToken(token)) next();
  10 +
  11 + const loginForm = new Login('admin', '123456');
  12 + authApiService.generateJwt(loginForm).then(resp => {
  13 + store.commit('login/defineToken', resp);
  14 + });
  15 +
  16 + next();
  17 + })
  18 +}
codigos/frontend/src/components/menu/Menu.vue 0 → 100644
@@ -0,0 +1,33 @@ @@ -0,0 +1,33 @@
  1 +<template>
  2 + <q-list>
  3 + <q-item class="item-list-menu column">
  4 + <ItemMenu v-for="item in menuList" :key="item.id" :path="item.path" :label="item.label"
  5 + :icon="item.icon" :selectedItemMenu="selectedItemMenu" :items="item.subitems"
  6 + @selectedItem="changeSelectedItemMenu" />
  7 + </q-item>
  8 + </q-list>
  9 +</template>
  10 +
  11 +<script lang="ts">
  12 +import {Vue, Component} from 'vue-property-decorator';
  13 +import ItemMenu from "./components/ItemMenu.vue";
  14 +import itemMenuList from '../../mixins/itemMenuList';
  15 +
  16 +@Component({
  17 + components: {ItemMenu}
  18 +})
  19 +export default class Menu extends Vue {
  20 + readonly menuList = itemMenuList;
  21 + selectedItemMenu = ""
  22 +
  23 + changeSelectedItemMenu(value: string) {
  24 + this.selectedItemMenu = value;
  25 + }
  26 +}
  27 +</script>
  28 +
  29 +<style lang="scss" scoped>
  30 +.item-list-menu {
  31 + padding: 0;
  32 +}
  33 +</style>
codigos/frontend/src/components/menu/components/ItemMenu.vue 0 → 100644
@@ -0,0 +1,137 @@ @@ -0,0 +1,137 @@
  1 +<template>
  2 + <div class="column">
  3 + <div class="column">
  4 + <q-item class="col-12" clickable @click="openSubMenuOrItem" :class="generateCssClass()">
  5 + <q-item-section class="col-2 icon">
  6 + <q-icon :name="icon"/>
  7 + </q-item-section>
  8 + <q-item-section class="col-10 justify-start label">
  9 + <q-item-label>
  10 + {{ label }}
  11 + </q-item-label>
  12 + </q-item-section>
  13 + </q-item>
  14 + </div>
  15 + <div class="column" v-show="items && subMenuVisible">
  16 + <SubItemMenu v-for="subitem in items" :icon="subitem.icon" :label="subitem.label"
  17 + :path="subitem.path" :key="subitem.id" :selected-item-menu="selectedItemMenu"
  18 + :itemId="itemId" @selectedItem="emitSelectedItem"
  19 + />
  20 + </div>
  21 + </div>
  22 +</template>
  23 +
  24 +<script lang="ts">
  25 +import {Vue, Component, Prop, Emit} from 'vue-property-decorator';
  26 +import SubItemMenu from "components/menu/components/SubItemMenu.vue";
  27 +import {SubItem} from "src/models/models";
  28 +
  29 +@Component({
  30 + components: {SubItemMenu}
  31 +})
  32 +export default class ItemMenu extends Vue {
  33 + @Prop({type: String, required: true})
  34 + readonly label !: string;
  35 +
  36 + @Prop({type: String, required: true})
  37 + readonly path !: string;
  38 +
  39 + @Prop({type: String, required: true})
  40 + readonly icon !: string;
  41 +
  42 + @Prop({type: String, required: true})
  43 + selectedItemMenu !: string;
  44 +
  45 + @Prop({type: Array, required: true})
  46 + readonly items !: SubItem[];
  47 +
  48 + itemId = 0;
  49 + subMenuVisible = false;
  50 +
  51 + get isSelectedItemMenu() {
  52 + const isSelectedItem = this.selectedItemMenu === this.label ||
  53 + this.selectedItemMenu === this.path;
  54 +
  55 + let subItemSelected = false;
  56 +
  57 + this.items.forEach(subitem => {
  58 + if (subitem.path === this.selectedItemMenu)
  59 + subItemSelected = true;
  60 + })
  61 +
  62 + return isSelectedItem || subItemSelected;
  63 + }
  64 +
  65 + @Emit('selectedItem')
  66 + openSubMenuOrItem() {
  67 + if (this.$route.path !== this.path) {
  68 + this.$router.push(this.path)
  69 + }
  70 +
  71 + // TODO: Pegar Item Id pelo Vuex e definir aqui
  72 + // this.itemId = Vuex.get()
  73 +
  74 + this.subMenuVisible = !this.subMenuVisible;
  75 + if (this.itemId) {
  76 + }
  77 +
  78 + return this.path;
  79 + }
  80 +
  81 + @Emit('selectedItem')
  82 + emitSelectedItem(event: any) {
  83 + return event;
  84 + }
  85 +
  86 + generateCssClass(): string {
  87 + if (!this.isSelectedItemMenu) {
  88 + this.subMenuVisible = false;
  89 + }
  90 +
  91 + return this.isSelectedItemMenu ? 'item-menu selected' : 'item-menu no-selected'
  92 + }
  93 +
  94 + mounted() {
  95 + this.itemId = this.$store.getters['navigationInfo/projectId'];
  96 + }
  97 +}
  98 +</script>
  99 +
  100 +<style lang="scss" scoped>
  101 +.item-menu {
  102 + .icon {
  103 + font-size: $font-h1;
  104 + }
  105 +
  106 + .label {
  107 + font-size: $font-normal;
  108 + }
  109 +}
  110 +
  111 +.no-selected {
  112 + background-color: $white;
  113 + color: $gunmetal;
  114 +
  115 + .icon {
  116 + color: $yellow-orange;
  117 + }
  118 +}
  119 +
  120 +.no-selected:hover {
  121 + background-color: $yellow-orange;
  122 + color: $white;
  123 +
  124 + .icon {
  125 + color: $white;
  126 + }
  127 +}
  128 +
  129 +.selected {
  130 + background-color: $gunmetal-2;
  131 + color: $white;
  132 +
  133 + .icon {
  134 + color: $yellow-orange;
  135 + }
  136 +}
  137 +</style>
codigos/frontend/src/components/menu/components/SubItemMenu.vue 0 → 100644
@@ -0,0 +1,92 @@ @@ -0,0 +1,92 @@
  1 +<template>
  2 + <q-item class="col-12" clickable @click="navigateTo" :class="generateCssClass()">
  3 + <div class="content row">
  4 + <q-item-section class="col-2 icon">
  5 + <q-icon :name="icon"/>
  6 + </q-item-section>
  7 + <q-item-section class="col-10 justify-start label">
  8 + <q-item-label>
  9 + {{ label }}
  10 + </q-item-label>
  11 + </q-item-section>
  12 + </div>
  13 + </q-item>
  14 +</template>
  15 +
  16 +<script lang="ts">
  17 +import {Vue, Component, Prop, Emit} from 'vue-property-decorator';
  18 +
  19 +@Component
  20 +export default class SubItemMenu extends Vue {
  21 + @Prop({type: String, required: true})
  22 + readonly label !: string;
  23 +
  24 + @Prop({type: String, required: true})
  25 + readonly path !: string;
  26 +
  27 + @Prop({type: String, required: true})
  28 + readonly icon !: string;
  29 +
  30 + @Prop({type: Number, required: true})
  31 + readonly itemId !: number;
  32 +
  33 + @Prop({type: String, required: true})
  34 + selectedItemMenu !: string;
  35 +
  36 + get isSelectedItemMenu() {
  37 + return this.selectedItemMenu === this.label ||
  38 + this.selectedItemMenu === this.path;
  39 + }
  40 +
  41 + @Emit('selectedItem')
  42 + navigateTo() {
  43 + if (this.$route.path !== this.path) {
  44 + this.$router.push(this.path);
  45 + }
  46 + return this.path;
  47 + }
  48 +
  49 + generateCssClass(): string {
  50 + return this.isSelectedItemMenu ? 'subitem-menu selected-subitem' : 'subitem-menu no-selected-subitem'
  51 + }
  52 +}
  53 +</script>
  54 +
  55 +<style lang="scss" scoped>
  56 +.subitem-menu {
  57 + .content {
  58 + margin-left: 5%;
  59 + width: 100%;
  60 + flex-wrap: nowrap;
  61 + }
  62 +
  63 + .icon {
  64 + font-size: $font-h1;
  65 + }
  66 +
  67 + .label {
  68 + font-size: $font-normal;
  69 + }
  70 +}
  71 +
  72 +.no-selected-subitem {
  73 + .icon {
  74 + color: $yellow-orange;
  75 + }
  76 +}
  77 +
  78 +.no-selected-subitem:hover {
  79 + background-color: $yellow-orange;
  80 + color: $white;
  81 +
  82 + .icon {
  83 + color: $white;
  84 + }
  85 +}
  86 +
  87 +.selected-subitem {
  88 + background-color: $yellow-orange;
  89 + color: $white;
  90 +}
  91 +
  92 +</style>
codigos/frontend/src/css/app.scss
1 -// app global css in SCSS form 1 +@import 'pages/login';
  2 +@import 'pages/index';
  3 +@import 'pages/projects';
  4 +@import 'pages/users';
  5 +
  6 +* {
  7 + font-family: 'Roboto', '-apple-system', 'Helvetica Neue', Helvetica, Arial, sans-serif;
  8 +}
  9 +
  10 +.header-style {
  11 + background-color: $yellow-orange;
  12 + color: $white;
  13 + border: none;
  14 +}
  15 +
  16 +.side-menu {
  17 + min-height: 100%;
  18 +}
  19 +
  20 +.menu-logo {
  21 + width: 100%;
  22 + margin-bottom: 20px;
  23 +
  24 + .image-logo {
  25 + width: 60%;
  26 + margin-left: -10%;
  27 + }
  28 +}
  29 +
  30 +.menu-logo-ifes {
  31 + width: 100%;
  32 + padding-top: 30px;
  33 +
  34 + .image-logo {
  35 + width: 70%;
  36 + }
  37 +}
  38 +
  39 +.menu-user {
  40 + .btn {
  41 + margin-left: 10px;
  42 + border-radius: 0;
  43 + }
  44 +
  45 + .btn-logout {
  46 + padding: 0 30px;
  47 + border-radius: 10px;
  48 + background-color: $gunmetal;
  49 + }
  50 +}
  51 +
  52 +.page {
  53 + background-color: $yellow-orange-bg;
  54 +}
  55 +
  56 +.footer-style {
  57 + background-color: $yellow-orange-bg;
  58 + font-weight: 500;
  59 + height: 50px;
  60 +}
  61 +
  62 +.card {
  63 + border-radius: 20px;
  64 +
  65 + .card-header {
  66 + width: 100%;
  67 + text-align: center;
  68 + font-size: $font-normal;
  69 + }
  70 +}
codigos/frontend/src/css/app.variables.scss 0 → 100644
@@ -0,0 +1,20 @@ @@ -0,0 +1,20 @@
  1 +// Default Application Variables
  2 +$tart-orange: #f94144ff;
  3 +$orange-red: #f3722cff;
  4 +$yellow-orange: #f8961eff;
  5 +$yellow-orange-bg: #fda53a;
  6 +$maize-crayola: #f9c74fff;
  7 +$pistachio: #90be6dff;
  8 +$jungle-green: #43aa8bff;
  9 +$queen-blue: #577590ff;
  10 +$gunmetal: #27333dff;
  11 +$gunmetal-2: #202931ff;
  12 +$white: #ffffff;
  13 +$transparent: transparent;
  14 +
  15 +$font-h1: 2em;
  16 +$font-h1-small: 1.6em;
  17 +$font-h2: 1.4em;
  18 +$font-normal: 1.2em;
  19 +$font-text: 1em;
  20 +$font-obs: 0.8em;
codigos/frontend/src/css/pages/index.scss 0 → 100644
@@ -0,0 +1,15 @@ @@ -0,0 +1,15 @@
  1 +.home-title {
  2 + color: $white;
  3 + font-size: $font-h1-small;
  4 + margin-top: 50px;
  5 + margin-bottom: 50px;
  6 +}
  7 +
  8 +.info {
  9 + width: 100%;
  10 +
  11 + .card {
  12 + width: 42%;
  13 + height: 350px;
  14 + }
  15 +}
codigos/frontend/src/css/pages/login.scss 0 → 100644
@@ -0,0 +1,25 @@ @@ -0,0 +1,25 @@
  1 +.login-page {
  2 + width: 100%;
  3 +
  4 + .card {
  5 + width: 25%;
  6 + }
  7 +
  8 + .login-logo {
  9 + margin-top: 20px;
  10 + width: 50%;
  11 + }
  12 +
  13 + .login-btn {
  14 + width: 40%;
  15 + background-color: $yellow-orange;
  16 + color: $white;
  17 + }
  18 +
  19 + .forget-password {
  20 + margin: 25px 0;
  21 + text-decoration: none;
  22 + color: $gunmetal;
  23 + }
  24 +}
  25 +
codigos/frontend/src/css/pages/projects.scss 0 → 100644
@@ -0,0 +1,97 @@ @@ -0,0 +1,97 @@
  1 +.initial-menu-buttons {
  2 + color: $white;
  3 + width: 60%;
  4 +
  5 + .project-btn {
  6 + font-size: 10em;
  7 + cursor: pointer;
  8 +
  9 + span {
  10 + margin-top: 30px;
  11 + font-size: 0.18em;
  12 + }
  13 + }
  14 +}
  15 +
  16 +.create-project {
  17 + width: 100%;
  18 + height: 100%;
  19 +
  20 + .card {
  21 + height: 470px;
  22 + }
  23 +
  24 + .form {
  25 + height: 375px;
  26 +
  27 + .fields {
  28 + width: 50%;
  29 + }
  30 +
  31 + .field-text {
  32 + margin-top: 30px;
  33 +
  34 + textarea {
  35 + resize: none;
  36 + overflow: hidden;
  37 + }
  38 + }
  39 +
  40 + .create-btn {
  41 + color: $white;
  42 + background-color: $yellow-orange;
  43 + width: 30%;
  44 + }
  45 + }
  46 +
  47 + .project-attributes {
  48 + height: 230px;
  49 +
  50 + p {
  51 + text-align: center;
  52 + font-size: $font-normal;
  53 + }
  54 +
  55 + .label {
  56 + color: $yellow-orange;
  57 + }
  58 +
  59 + .fields {
  60 + width: 80%;
  61 + }
  62 +
  63 + .attribute-btn {
  64 + width: 80%;
  65 + color: $white;
  66 + font-size: $font-text;
  67 + background-color: $yellow-orange;
  68 + }
  69 + }
  70 +}
  71 +
  72 +.list-projects {
  73 + width: 100%;
  74 +
  75 + .card {
  76 + width: 60%;
  77 + }
  78 +
  79 + .list-projects-content {
  80 + height: 100%;
  81 + overflow-y: auto;
  82 + height: 400px;
  83 +
  84 + .projects-table {
  85 + width: 80%;
  86 + max-height: 300px;
  87 + }
  88 +
  89 + .action-buttons {
  90 + width: 80%;
  91 +
  92 + * {
  93 + color: $white;
  94 + }
  95 + }
  96 + }
  97 +}
codigos/frontend/src/css/pages/users.scss 0 → 100644
@@ -0,0 +1,20 @@ @@ -0,0 +1,20 @@
  1 +.info-users {
  2 + width: 100%;
  3 +
  4 + .card {
  5 + width: 45%;
  6 + }
  7 +
  8 + .info-fields {
  9 + font-size: $font-text;
  10 + width: 80%;
  11 +
  12 + div {
  13 + margin-bottom: 10px;
  14 + }
  15 +
  16 + .label {
  17 + color: $yellow-orange;
  18 + }
  19 + }
  20 +}
codigos/frontend/src/css/quasar.variables.scss
@@ -11,6 +11,7 @@ @@ -11,6 +11,7 @@
11 // It's highly recommended to change the default colors 11 // It's highly recommended to change the default colors
12 // to match your app's branding. 12 // to match your app's branding.
13 // Tip: Use the "Theme Builder" on Quasar's documentation website. 13 // Tip: Use the "Theme Builder" on Quasar's documentation website.
  14 +@import "app.variables";
14 15
15 $primary : #1976D2; 16 $primary : #1976D2;
16 $secondary : #26A69A; 17 $secondary : #26A69A;
@@ -22,13 +23,3 @@ $positive : #21BA45; @@ -22,13 +23,3 @@ $positive : #21BA45;
22 $negative : #C10015; 23 $negative : #C10015;
23 $info : #31CCEC; 24 $info : #31CCEC;
24 $warning : #F2C037; 25 $warning : #F2C037;
25 -  
26 -$tart-orange: #f94144ff;  
27 -$orange-red: #f3722cff;  
28 -$yellow-orange-color-wheel: #f8961eff;  
29 -$maize-crayola: #f9c74fff;  
30 -$pistachio: #90be6dff;  
31 -$jungle-green: #43aa8bff;  
32 -$queen-blue: #577590ff;  
33 -$gunmetal: #27333dff;  
34 -$gunmetal-2: #202931ff;  
codigos/frontend/src/env.d.ts 0 → 100644
@@ -0,0 +1,7 @@ @@ -0,0 +1,7 @@
  1 +declare namespace NodeJS {
  2 + interface ProcessEnv {
  3 + NODE_ENV: string;
  4 + VUE_ROUTER_MODE: 'hash' | 'history' | 'abstract' | undefined;
  5 + VUE_ROUTER_BASE: string | undefined;
  6 + }
  7 +}
codigos/frontend/src/layouts/LoginLayout.vue 0 → 100644
@@ -0,0 +1,19 @@ @@ -0,0 +1,19 @@
  1 +<template>
  2 + <q-layout view="hhh lpr fff">
  3 + <q-page-container>
  4 + <router-view />
  5 + </q-page-container>
  6 +
  7 + <q-footer class="footer-style row justify-center items-center">
  8 + Desenvolvido por Herik S.Lorenção
  9 + </q-footer>
  10 + </q-layout>
  11 +</template>
  12 +
  13 +<script lang="ts">
  14 +import {Vue, Component} from 'vue-property-decorator';
  15 +
  16 +@Component
  17 +export default class LoginLayout extends Vue{
  18 +}
  19 +</script>
codigos/frontend/src/layouts/MainLayout.vue 0 → 100644
@@ -0,0 +1,99 @@ @@ -0,0 +1,99 @@
  1 +<template>
  2 + <q-layout view="lHh Lpr lFf">
  3 + <q-header bordered class="header-style" elevated>
  4 + <q-toolbar class="row justify-between">
  5 + <div>
  6 + <q-btn
  7 + flat
  8 + dense
  9 + round
  10 + icon="menu"
  11 + aria-label="Menu"
  12 + @click="leftDrawerOpen = !leftDrawerOpen"
  13 + />
  14 + <q-btn icon="home" @click="navigateToHome" flat />
  15 + </div>
  16 +
  17 + <div class="menu-user row items-center">
  18 + <q-fab square class="btn" icon="person" :label="adminName" direction="down" flat
  19 + no-caps>
  20 + <q-fab-action class="btn-logout" @click="logout" text-color="white">
  21 + Sair
  22 + </q-fab-action>
  23 + </q-fab>
  24 + </div>
  25 + </q-toolbar>
  26 + </q-header>
  27 +
  28 + <q-drawer
  29 + v-model="leftDrawerOpen"
  30 + show-if-above
  31 + bordered
  32 + >
  33 + <q-list class="side-menu column justify-between">
  34 + <div>
  35 + <q-item-label
  36 + header
  37 + class="text-grey-8"
  38 + >
  39 + <div class="menu-logo row justify-center">
  40 + <q-img class="image-logo" src="../assets/logo/primaryLogo.png" />
  41 + </div>
  42 + </q-item-label>
  43 + <Menu></Menu>
  44 + <q-item-label
  45 + class="self-end"
  46 + >
  47 + </q-item-label>
  48 + </div>
  49 + <div class="menu-logo-ifes row justify-center">
  50 + <q-img class="image-logo" src="../assets/ifes-logo.png" />
  51 + </div>
  52 + </q-list>
  53 + </q-drawer>
  54 +
  55 + <q-page-container>
  56 + <router-view />
  57 + </q-page-container>
  58 +
  59 + <q-footer class="footer-style row justify-center items-center">
  60 + Desenvolvido por Herik S.Lorenção
  61 + </q-footer>
  62 + </q-layout>
  63 +</template>
  64 +
  65 +<script lang="ts">
  66 +import { Vue, Component } from 'vue-property-decorator';
  67 +import Menu from "components/menu/Menu.vue";
  68 +import AdminService from "src/services/AdminService";
  69 +
  70 +@Component({
  71 + components: { Menu },
  72 +})
  73 +export default class MainLayout extends Vue {
  74 + leftDrawerOpen = false;
  75 + adminName = '';
  76 +
  77 + navigateToHome() {
  78 + if (this.$route.path !== '/') {
  79 + this.$router.push('/');
  80 + }
  81 + }
  82 +
  83 + logout() {
  84 + this.$store.commit('login/defineUserId', null);
  85 + this.$router.push('/login');
  86 + }
  87 +
  88 + async mounted() {
  89 + const adminService = new AdminService();
  90 + const userId = this.$store.getters['login/getIdUsuario'];
  91 +
  92 + const admin = await adminService.find(userId);
  93 +
  94 + if (admin && admin.name) {
  95 + this.adminName = admin.name;
  96 + }
  97 + }
  98 +}
  99 +</script>
codigos/frontend/src/mixins/itemMenuList.ts 0 → 100644
@@ -0,0 +1,71 @@ @@ -0,0 +1,71 @@
  1 +import {ItemMenu} from "src/models/models";
  2 +
  3 +const values: ItemMenu[] = [
  4 + {
  5 + id: 1,
  6 + path: '/projetos',
  7 + label: 'Projetos',
  8 + icon: 'attach_file',
  9 + subitems: [
  10 + {
  11 + id: 1,
  12 + label: 'Usuários',
  13 + path: 'projetos/usuarios',
  14 + icon: 'person'
  15 + },
  16 + {
  17 + id: 2,
  18 + label: 'Recomendações',
  19 + path: 'projetos/recomendacoes',
  20 + icon: 'emoji_objects'
  21 + },
  22 + {
  23 + id: 3,
  24 + label: 'Avaliações',
  25 + path: 'projetos/avaliacoes',
  26 + icon: 'edit'
  27 + },
  28 + {
  29 + id: 4,
  30 + label: 'Tags',
  31 + path: 'projetos/tags',
  32 + icon: 'local_offer'
  33 + },
  34 + {
  35 + id: 5,
  36 + label: 'Tipos de Item',
  37 + path: 'projetos/tipositens',
  38 + icon: 'category'
  39 + },
  40 + {
  41 + id: 6,
  42 + label: 'Itens',
  43 + path: 'projetos/itens',
  44 + icon: 'pageview'
  45 + }
  46 + ]
  47 + },
  48 + {
  49 + id: 2,
  50 + path: 'tags',
  51 + label: 'Tags',
  52 + icon: 'local_offer',
  53 + subitems: []
  54 + },
  55 + {
  56 + id: 3,
  57 + path: 'tipoitens',
  58 + label: 'Tipos de Item',
  59 + icon: 'category',
  60 + subitems: []
  61 + },
  62 + {
  63 + id: 4,
  64 + path: "apis",
  65 + label: 'APIs',
  66 + icon: 'settings',
  67 + subitems: []
  68 + },
  69 +];
  70 +
  71 +export default values;
codigos/frontend/src/mixins/notification.ts 0 → 100644
@@ -0,0 +1,12 @@ @@ -0,0 +1,12 @@
  1 +import {Notify} from 'quasar'
  2 +
  3 +export const TypeMessage = {
  4 + success: 'positive',
  5 + warning: 'warning',
  6 + info: 'info',
  7 + error: 'negative'
  8 +}
  9 +
  10 +export default function notify(this: any, message: string, type: string) {
  11 + Notify.create({message, type, position: 'bottom-right'});
  12 +}
codigos/frontend/src/mixins/tableInfo/listProject.ts 0 → 100644
@@ -0,0 +1,17 @@ @@ -0,0 +1,17 @@
  1 +export default {
  2 + pagination: {
  3 + sortBy: 'desc',
  4 + descending: false,
  5 + page: 1,
  6 + rowsPerPage: 3
  7 + },
  8 + columns: [
  9 + {
  10 + name: 'name',
  11 + field: 'name',
  12 + label: 'Nome',
  13 + align: 'center',
  14 + sortable: true
  15 + }
  16 + ]
  17 +}
codigos/frontend/src/mixins/tableInfo/listUser.ts 0 → 100644
@@ -0,0 +1,25 @@ @@ -0,0 +1,25 @@
  1 +export default {
  2 + columns: [
  3 + {
  4 + name: 'id',
  5 + field: 'id',
  6 + label: 'Código',
  7 + align: 'center',
  8 + sortable: true
  9 + },
  10 + {
  11 + name: 'name',
  12 + field: 'name',
  13 + label: 'Nome',
  14 + align: 'center',
  15 + sortable: true
  16 + },
  17 + {
  18 + name: 'email',
  19 + field: 'email',
  20 + label: 'Email',
  21 + align: 'center',
  22 + sortable: true
  23 + }
  24 + ]
  25 +}
codigos/frontend/src/models/Admin.ts 0 → 100644
@@ -0,0 +1,57 @@ @@ -0,0 +1,57 @@
  1 +import FormRequest from "src/models/FormRequest";
  2 +
  3 +export default class Admin extends FormRequest {
  4 + private _id: number;
  5 + private _name: string;
  6 + private _login: string;
  7 + private _email: string;
  8 +
  9 + constructor(id: number, name: string, login: string, email: string) {
  10 + super();
  11 + this._id = id;
  12 + this._name = name;
  13 + this._login = login;
  14 + this._email = email;
  15 + }
  16 +
  17 + get id(): number {
  18 + return this._id;
  19 + }
  20 +
  21 + set id(value: number) {
  22 + this._id = value;
  23 + }
  24 +
  25 + get name(): string {
  26 + return this._name;
  27 + }
  28 +
  29 + set name(value: string) {
  30 + this._name = value;
  31 + }
  32 +
  33 + get login(): string {
  34 + return this._login;
  35 + }
  36 +
  37 + set login(value: string) {
  38 + this._login = value;
  39 + }
  40 +
  41 + get email(): string {
  42 + return this._email;
  43 + }
  44 +
  45 + set email(value: string) {
  46 + this._email = value;
  47 + }
  48 +
  49 + public build(): object {
  50 + return {
  51 + id: this._id,
  52 + name: this._name,
  53 + login: this._login,
  54 + email: this._email
  55 + }
  56 + }
  57 +}
codigos/frontend/src/models/FormRequest.ts 0 → 100644
@@ -0,0 +1,9 @@ @@ -0,0 +1,9 @@
  1 +import {ParseItem} from "src/models/models";
  2 +
  3 +export default abstract class FormRequest {
  4 + build(): object {
  5 + return {}
  6 + }
  7 +
  8 + public parseNames: ParseItem[] = [];
  9 +}
codigos/frontend/src/models/Login.ts 0 → 100644
@@ -0,0 +1,37 @@ @@ -0,0 +1,37 @@
  1 +import FormRequest from "src/models/FormRequest";
  2 +
  3 +export default class Login extends FormRequest{
  4 + private _login: string;
  5 + private _password: string;
  6 +
  7 +
  8 + constructor(login: string, password: string) {
  9 + super();
  10 + this._login = login;
  11 + this._password = password;
  12 + }
  13 +
  14 +
  15 + get login(): string {
  16 + return this._login;
  17 + }
  18 +
  19 + set login(value: string) {
  20 + this._login = value;
  21 + }
  22 +
  23 + get password(): string {
  24 + return this._password;
  25 + }
  26 +
  27 + set password(value: string) {
  28 + this._password = value;
  29 + }
  30 +
  31 + public build(): object {
  32 + return {
  33 + login: this._login,
  34 + password: this._password
  35 + }
  36 + }
  37 +}
codigos/frontend/src/models/Project.ts 0 → 100644
@@ -0,0 +1,80 @@ @@ -0,0 +1,80 @@
  1 +import FormRequest from "src/models/FormRequest";
  2 +import {ParseItem} from "src/models/models";
  3 +
  4 +export default class Project extends FormRequest {
  5 + private _name: string;
  6 + private _description: string;
  7 + private _adminId: number;
  8 + private _situation: string;
  9 + private _visible: boolean;
  10 +
  11 + public parseNames: ParseItem[] = [
  12 + {
  13 + fieldName: 'name',
  14 + translation: 'nome'
  15 + },
  16 + {
  17 + fieldName: 'description',
  18 + translation: 'descrição'
  19 + }
  20 + ];
  21 +
  22 + constructor(name: string, description: string, adminId: number, situation: string, visible: boolean) {
  23 + super();
  24 + this._name = name;
  25 + this._description = description;
  26 + this._adminId = adminId;
  27 + this._situation = situation;
  28 + this._visible = visible;
  29 + }
  30 +
  31 + get name(): string {
  32 + return this._name;
  33 + }
  34 +
  35 + set name(value: string) {
  36 + this._name = value;
  37 + }
  38 +
  39 + get description(): string {
  40 + return this._description;
  41 + }
  42 +
  43 + set description(value: string) {
  44 + this._description = value;
  45 + }
  46 +
  47 + get adminId(): number {
  48 + return this._adminId;
  49 + }
  50 +
  51 + set adminId(value: number) {
  52 + this._adminId = value;
  53 + }
  54 +
  55 + get situation(): string {
  56 + return this._situation;
  57 + }
  58 +
  59 + set situation(value: string) {
  60 + this._situation = value;
  61 + }
  62 +
  63 + get visible(): boolean {
  64 + return this._visible;
  65 + }
  66 +
  67 + set visible(value: boolean) {
  68 + this._visible = value;
  69 + }
  70 +
  71 + public build(): object {
  72 + return {
  73 + name: this._name,
  74 + description: this._description,
  75 + adminId: this._adminId,
  76 + situation: this._situation,
  77 + visible: this._visible
  78 + };
  79 + }
  80 +}
codigos/frontend/src/models/User.ts 0 → 100644
@@ -0,0 +1,72 @@ @@ -0,0 +1,72 @@
  1 +import FormRequest from "src/models/FormRequest";
  2 +import {ParseItem} from "src/models/models";
  3 +
  4 +export default class User extends FormRequest {
  5 + private _name: string;
  6 + private _login: string;
  7 + private _password: string;
  8 + private _email: string;
  9 +
  10 + public parseNames: ParseItem[] = [
  11 + {
  12 + fieldName: 'name',
  13 + translation: 'nome'
  14 + },
  15 + {
  16 + fieldName: 'description',
  17 + translation: 'descrição'
  18 + }
  19 + ];
  20 +
  21 +
  22 + constructor(name: string, login: string, password: string, email: string, parseNames: ParseItem[]) {
  23 + super();
  24 + this._name = name;
  25 + this._login = login;
  26 + this._password = password;
  27 + this._email = email;
  28 + this.parseNames = parseNames;
  29 + }
  30 +
  31 +
  32 + get name(): string {
  33 + return this._name;
  34 + }
  35 +
  36 + set name(value: string) {
  37 + this._name = value;
  38 + }
  39 +
  40 + get login(): string {
  41 + return this._login;
  42 + }
  43 +
  44 + set login(value: string) {
  45 + this._login = value;
  46 + }
  47 +
  48 + get password(): string {
  49 + return this._password;
  50 + }
  51 +
  52 + set password(value: string) {
  53 + this._password = value;
  54 + }
  55 +
  56 + get email(): string {
  57 + return this._email;
  58 + }
  59 +
  60 + set email(value: string) {
  61 + this._email = value;
  62 + }
  63 +
  64 + public build(): object {
  65 + return {
  66 + name: this._name,
  67 + login: this._login,
  68 + password: this._password,
  69 + email: this._email
  70 + }
  71 + }
  72 +}
codigos/frontend/src/models/models.ts 0 → 100644
@@ -0,0 +1,20 @@ @@ -0,0 +1,20 @@
  1 +export interface SubItem {
  2 + id: number,
  3 + label: string,
  4 + path: string,
  5 + icon: string
  6 +}
  7 +
  8 +export interface ItemMenu {
  9 + id: number,
  10 + label: string,
  11 + path: string,
  12 + icon: string,
  13 + subitems: SubItem[]
  14 +}
  15 +
  16 +
  17 +export interface ParseItem {
  18 + fieldName: string,
  19 + translation: string
  20 +}
codigos/frontend/src/pages/Error404.vue
@@ -22,8 +22,9 @@ @@ -22,8 +22,9 @@
22 </div> 22 </div>
23 </template> 23 </template>
24 24
25 -<script >  
26 -export default {  
27 - name: 'Error404'  
28 -} 25 +<script lang="ts">
  26 +import { Vue, Component } from 'vue-property-decorator';
  27 +
  28 +@Component
  29 +export default class Error404 extends Vue {}
29 </script> 30 </script>
codigos/frontend/src/pages/Index.vue
1 <template> 1 <template>
2 - <q-page class="flex flex-center">  
3 - <img  
4 - alt="Quasar logo"  
5 - src="~assets/quasar-logo-full.svg"  
6 - > 2 + <q-page class="column items-center justify-start page">
  3 + <div class="home-title">
  4 + Bem vindo Usuário!
  5 + </div>
  6 + <div class="info row justify-around">
  7 + <q-card flat bordered class="card">
  8 + <q-card-section>
  9 + <div class="card-header">Usuários que receberam recomendações</div>
  10 + </q-card-section>
  11 + </q-card>
  12 +
  13 + <q-card flat bordered class="card">
  14 + <q-card-section>
  15 + <div class="card-header">Usuários que receberam recomendações</div>
  16 + </q-card-section>
  17 + </q-card>
  18 + </div>
7 </q-page> 19 </q-page>
8 </template> 20 </template>
9 21
10 -<script>  
11 -export default {  
12 - name: 'PageIndex' 22 +<script lang="ts">
  23 +import { Vue, Component } from 'vue-property-decorator';
  24 +
  25 +@Component
  26 +export default class Index extends Vue {
13 } 27 }
14 </script> 28 </script>
codigos/frontend/src/pages/Login.vue 0 → 100644
@@ -0,0 +1,47 @@ @@ -0,0 +1,47 @@
  1 +<template>
  2 + <q-page class="login-page column items-center justify-center page">
  3 + <q-card flat bordered class="card col-6">
  4 + <q-card-section class="column items-center">
  5 + <q-img class="login-logo" src="../assets/logo/loginLogo.png" />
  6 + </q-card-section>
  7 + <q-card-section class="form column items-center">
  8 + <q-input v-model="username" color="orange" placeholder="Login">
  9 + <template v-slot:prepend>
  10 + <q-icon name="person" />
  11 + </template>
  12 + </q-input>
  13 + <q-input v-model="password" color="orange" placeholder="Senha" type="password">
  14 + <template v-slot:prepend>
  15 + <q-icon name="vpn_key" />
  16 + </template>
  17 + </q-input>
  18 + </q-card-section>
  19 + <q-card-section class="column items-center">
  20 + <q-btn @click="logInto" class="login-btn" label="Entrar" no-caps />
  21 + <router-link class="forget-password" to="cadastrar">
  22 + Esqueceu a Senha?
  23 + </router-link>
  24 + </q-card-section>
  25 + </q-card>
  26 + </q-page>
  27 +</template>
  28 +
  29 +<script lang="ts">
  30 +import { Vue, Component } from 'vue-property-decorator';
  31 +import LoginService from "src/services/LoginService";
  32 +
  33 +@Component
  34 +export default class Login extends Vue{
  35 + username: string = '';
  36 + password: string = '';
  37 + loginService = new LoginService();
  38 +
  39 + async logInto() {
  40 + const logged = await this.loginService.login(this.username, this.password);
  41 +
  42 + if (logged) {
  43 + this.$router.push('/');
  44 + }
  45 + }
  46 +}
  47 +</script>
codigos/frontend/src/pages/Projects.vue 0 → 100644
@@ -0,0 +1,79 @@ @@ -0,0 +1,79 @@
  1 +<template>
  2 + <q-page class="column items-center justify-center page">
  3 + <div v-show="initialMenuIsVisible" class="initial-menu-buttons row justify-around">
  4 + <div @click="createNewProject" class="project-btn column items-center">
  5 + <q-icon name="add_circle"/>
  6 + <span>Criar Projeto</span>
  7 + </div>
  8 + <div @click="showListProjectsPage" class="project-btn column items-center">
  9 + <q-icon name="edit"/>
  10 + <span>Listar Existentes</span>
  11 + </div>
  12 + </div>
  13 +
  14 + <div class="row justify-around create-project" v-if="createProjectIsVisible">
  15 + <CreateProject @projectCreated="hideCreateProjectPageAndShowList"></CreateProject>
  16 + </div>
  17 +
  18 + <div class="row justify-around create-project" v-if="listProjectsIsVisible">
  19 + <ListProjects @editProject="showEditProjectPage"/>
  20 + </div>
  21 +
  22 + <div class="row justify-around create-project" v-if="editProjectIsVisible">
  23 + <EditProject :projectData="projectEditInfo" />
  24 + </div>
  25 + </q-page>
  26 +</template>
  27 +
  28 +<script lang="ts">
  29 +import {Vue, Component} from 'vue-property-decorator';
  30 +import CreateProject from './projects/CreateProject.vue';
  31 +import ListProjects from './projects/ListProjects.vue';
  32 +import EditProject from "pages/projects/EditProject.vue";
  33 +
  34 +@Component({
  35 + components: {CreateProject, ListProjects, EditProject}
  36 +})
  37 +export default class Projects extends Vue {
  38 + initialMenuIsVisible: boolean = true;
  39 + createProjectIsVisible: boolean = false;
  40 + listProjectsIsVisible: boolean = false;
  41 + editProjectIsVisible: boolean = false;
  42 + projectEditInfo: any = {};
  43 +
  44 + hideInitialMenu() {
  45 + this.initialMenuIsVisible = false;
  46 + }
  47 +
  48 + showCreateProjectPage() {
  49 + this.hideInitialMenu();
  50 + this.createProjectIsVisible = true;
  51 + }
  52 +
  53 + showListProjectsPage() {
  54 + this.hideInitialMenu();
  55 + this.listProjectsIsVisible = true;
  56 + this.editProjectIsVisible = false;
  57 + }
  58 +
  59 + hideCreateProjectPageAndShowList() {
  60 + this.hideInitialMenu();
  61 + this.createProjectIsVisible = false;
  62 + this.editProjectIsVisible = false;
  63 + this.listProjectsIsVisible = true;
  64 + }
  65 +
  66 + showEditProjectPage(projectInfo: any) {
  67 + this.hideInitialMenu();
  68 + this.createProjectIsVisible = false;
  69 + this.editProjectIsVisible = true;
  70 + this.listProjectsIsVisible = false;
  71 +
  72 + this.projectEditInfo = projectInfo;
  73 + }
  74 +
  75 + createNewProject() {
  76 + this.showCreateProjectPage();
  77 + }
  78 +}
  79 +</script>
codigos/frontend/src/pages/projects/CreateProject.vue 0 → 100644
@@ -0,0 +1,90 @@ @@ -0,0 +1,90 @@
  1 +<template>
  2 + <div class="row justify-around create-project">
  3 + <q-card flat bordered class="card col-6">
  4 + <q-card-section>
  5 + <div class="card-header">Criar Projeto</div>
  6 + </q-card-section>
  7 + <q-card-section class="form column justify-between items-center">
  8 + <div class="fields">
  9 + <div class="field">
  10 + <q-input v-model="projectForm.name" color="orange" label="Nome"
  11 + ref="nameInput"
  12 + placeholder="Informe o nome"/>
  13 + </div>
  14 + <div class="field-text">
  15 + <q-input v-model="projectForm.description" type="textarea" color="orange"
  16 + placeholder="Informe a descrição" label="Descrição" outlined
  17 + />
  18 + </div>
  19 + </div>
  20 + <q-btn @click="createProject" class="create-btn" label="Criar" no-caps/>
  21 + </q-card-section>
  22 + </q-card>
  23 +
  24 + <q-card flat bordered class="card col-4 project-attributes column items-center">
  25 + <q-card-section>
  26 + <div class="card-header">Atributos do Projeto</div>
  27 + </q-card-section>
  28 + <q-card-section class="fields column">
  29 + <div class="field column">
  30 + <p><span class="label">Status:</span> {{ projectStatus }}</p>
  31 + </div>
  32 + <div class="field column items-center">
  33 + <p><span class="label">Visibilidade:</span> {{ projectVisibility }}</p>
  34 + <q-btn @click="changeVisible" class="attribute-btn" :label="getVisibilityBtnLabel()"
  35 + no-caps/>
  36 + </div>
  37 + </q-card-section>
  38 + </q-card>
  39 + </div>
  40 +</template>
  41 +
  42 +<script>
  43 +import {Vue, Component, Prop} from 'vue-property-decorator';
  44 +import ProjectService from "src/services/ProjectService";
  45 +import Project from "src/models/Project";
  46 +
  47 +@Component
  48 +export default class CreateProject extends Vue {
  49 + projectForm = {
  50 + name: '',
  51 + description: '',
  52 + visible: false,
  53 + situation: 'OPEN',
  54 + adminId: this.$store.getters['login/getIdUsuario']
  55 + }
  56 +
  57 + get projectStatus() {
  58 + return this.projectForm.situation === 'OPEN' ? 'Aberto' : 'Fechado';
  59 + }
  60 +
  61 + get projectVisibility() {
  62 + return this.projectForm.visible ? 'Visível' : 'Invisível';
  63 + }
  64 +
  65 + getVisibilityBtnLabel() {
  66 + return this.projectForm.visible ? 'Tornar Invisível' : 'Tornar Visível';
  67 + }
  68 +
  69 + changeVisible() {
  70 + return this.projectForm.visible = !this.projectForm.visible;
  71 + }
  72 +
  73 + async createProject() {
  74 + const projectService = new ProjectService();
  75 + const projectForm = new Project(
  76 + this.projectForm.name,
  77 + this.projectForm.description,
  78 + this.projectForm.adminId,
  79 + this.projectForm.situation,
  80 + this.projectForm.visible
  81 + );
  82 +
  83 + const projectIsCreated = await projectService.create(projectForm);
  84 +
  85 + if (projectIsCreated !== false) {
  86 + this.$emit('projectCreated')
  87 + }
  88 + }
  89 +}
  90 +</script>
codigos/frontend/src/pages/projects/EditProject.vue 0 → 100644
@@ -0,0 +1,109 @@ @@ -0,0 +1,109 @@
  1 +<template>
  2 + <div class="row justify-around create-project">
  3 + <q-card flat bordered class="card col-6">
  4 + <q-card-section>
  5 + <div class="card-header">Editar Projeto</div>
  6 + </q-card-section>
  7 + <q-card-section class="form column justify-between items-center">
  8 + <div class="fields">
  9 + <div class="field">
  10 + <q-input v-model="projectForm.name" color="orange" label="Nome"
  11 + ref="nameInput"
  12 + placeholder="Informe o nome"/>
  13 + </div>
  14 + <div class="field-text">
  15 + <q-input v-model="projectForm.description" type="textarea" color="orange"
  16 + placeholder="Informe a descrição" label="Descrição" outlined
  17 + />
  18 + </div>
  19 + </div>
  20 + <div class="actions-buttons">
  21 + <q-btn @click="editProject" class="create-btn" label="Remover" no-caps/>
  22 + <q-btn @click="editProject" class="create-btn" label="Salvar" no-caps/>
  23 + </div>
  24 + </q-card-section>
  25 + </q-card>
  26 +
  27 + <q-card flat bordered class="card col-4 project-attributes column items-center">
  28 + <q-card-section>
  29 + <div class="card-header">Atributos do Projeto</div>
  30 + </q-card-section>
  31 + <q-card-section class="fields column">
  32 + <div class="field column">
  33 + <p><span class="label">Status:</span> {{ projectStatus }}</p>
  34 + <q-btn @click="changeStatus" class="attribute-btn" :label="getStatusBtnLabel()"
  35 + no-caps/>
  36 + </div>
  37 + <div class="field column items-center">
  38 + <p><span class="label">Visibilidade:</span> {{ projectVisibility }}</p>
  39 + <q-btn @click="changeVisible" class="attribute-btn" :label="getVisibilityBtnLabel()"
  40 + no-caps/>
  41 + </div>
  42 + </q-card-section>
  43 + </q-card>
  44 + </div>
  45 +</template>
  46 +
  47 +<script lang="ts">
  48 +import {Vue, Component, Prop} from 'vue-property-decorator';
  49 +import ProjectService from "src/services/ProjectService";
  50 +import Project from "src/models/Project";
  51 +
  52 +@Component
  53 +export default class EditProject extends Vue {
  54 + @Prop({required: true, type: Object})
  55 + projectData: any;
  56 + projectForm: any = {}
  57 +
  58 + get projectStatus() {
  59 + return this.projectForm.situation === 'OPEN' ? 'Aberto' : 'Fechado';
  60 + }
  61 +
  62 + get projectVisibility() {
  63 + return this.projectForm.visible ? 'Visível' : 'Invisível';
  64 + }
  65 +
  66 + getVisibilityBtnLabel() {
  67 + return this.projectForm.visible ? 'Tornar Invisível' : 'Tornar Visível';
  68 + }
  69 +
  70 + getStatusBtnLabel() {
  71 + return this.projectForm.situation === 'OPEN' ? 'Fechar Projeto': 'Abrir Projeto';
  72 + }
  73 +
  74 + changeVisible() {
  75 + return this.projectForm.visible = !this.projectForm.visible;
  76 + }
  77 +
  78 + changeStatus() {
  79 + return this.projectForm.situation === 'OPEN' ? 'CLOSED': 'OPEN';
  80 + }
  81 +
  82 + async editProject() {
  83 + const projectService = new ProjectService();
  84 + const projectData = new Project(
  85 + this.projectForm.name,
  86 + this.projectForm.description,
  87 + this.projectForm.adminId,
  88 + this.projectForm.projectStatus,
  89 + this.projectForm.visible
  90 + );
  91 +
  92 + await projectService.update(projectData, this.projectData.id);
  93 + }
  94 +
  95 + async removeProject() {
  96 + const projectService = new ProjectService();
  97 + }
  98 +
  99 + created() {
  100 + this.projectForm = {
  101 + name: this.projectData.name,
  102 + description: this.projectData.description,
  103 + visible: this.projectData.visible,
  104 + situation: this.projectData.situation,
  105 + adminId: this.$store.getters['login/getIdUsuario']
  106 + }
  107 + }
  108 +}
  109 +</script>
codigos/frontend/src/pages/projects/ListProjects.vue 0 → 100644
@@ -0,0 +1,60 @@ @@ -0,0 +1,60 @@
  1 +<template>
  2 + <div class="list-projects column justify-center items-center">
  3 + <q-card flat bordered class="card col-6">
  4 + <q-card-section>
  5 + <div class="card-header">Selecione o Projeto</div>
  6 + </q-card-section>
  7 + <q-card-section class="list-projects-content column justify-between items-center">
  8 + <q-table
  9 + class="projects-table"
  10 + row-key="id"
  11 + :data="tableInfo.data"
  12 + :columns="tableInfo.columns"
  13 + :pagination="tableInfo.pagination"
  14 + selection="single"
  15 + :selected.sync="selectedItem"
  16 + />
  17 + <div class="action-buttons row justify-around" v-show="isProjectSelected">
  18 + <q-btn color="orange" @click="selectedProject"
  19 + label="Selecionar Projeto" no-caps />
  20 + <q-btn @click="editProject" color="orange" label="Alterar Projeto" no-caps />
  21 + </div>
  22 + </q-card-section>
  23 + </q-card>
  24 + </div>
  25 +</template>
  26 +
  27 +<script lang="ts">
  28 +import {Vue, Component, Prop} from 'vue-property-decorator';
  29 +import projectsTableInfo from '../../mixins/tableInfo/listProject';
  30 +import notify, {TypeMessage} from "src/mixins/notification";
  31 +import ProjectService from "src/services/ProjectService";
  32 +
  33 +@Component
  34 +export default class ListProjects extends Vue {
  35 + tableInfo: any = {};
  36 + selectedItem: any = [];
  37 +
  38 +
  39 + get isProjectSelected() {
  40 + return this.selectedItem.length > 0;
  41 + }
  42 +
  43 + async selectedProject() {
  44 + await this.$store.commit('navigationInfo/defineProjectId', this.selectedItem[0].id);
  45 + notify('Um projeto foi selecionado', TypeMessage.success);
  46 + notify('Esse projeto servirá de base para navegação nos menus', TypeMessage.info);
  47 + }
  48 +
  49 + editProject() {
  50 + this.$emit('editProject', this.selectedItem[0]);
  51 + }
  52 +
  53 + async mounted() {
  54 + const projectService = new ProjectService();
  55 + const projectsResponse = await projectService.findAll();
  56 + this.tableInfo = projectsTableInfo;
  57 + this.tableInfo.data = projectsResponse;
  58 + }
  59 +}
  60 +</script>
codigos/frontend/src/pages/users/ListUsers.vue 0 → 100644
@@ -0,0 +1,44 @@ @@ -0,0 +1,44 @@
  1 +<template>
  2 + <q-page class="column items-center justify-center page">
  3 + <div class="info-users row justify-around">
  4 + <q-card flat bordered class="card col-6">
  5 + <q-card-section>
  6 + <div class="card-header">Dados dos Usuários</div>
  7 + </q-card-section>
  8 + <q-card-section class="info-fields">
  9 + <div class="row">
  10 + <span class="label">Nome:</span>
  11 + <span class="content"></span>
  12 + </div>
  13 + <div class="row">
  14 + <span class="label">Login:</span>
  15 + <span class="content"></span>
  16 + </div>
  17 + <div class="row">
  18 + <span class="label">Email:</span>
  19 + <span class="content"></span>
  20 + </div>
  21 + </q-card-section>
  22 + </q-card>
  23 + <q-card flat bordered class="card col-6">
  24 + <q-card-section>
  25 + <div class="card-header">Informações dos Usuários</div>
  26 + </q-card-section>
  27 + <q-card-section>
  28 +
  29 + </q-card-section>
  30 + </q-card>
  31 + </div>
  32 + </q-page>
  33 +</template>
  34 +
  35 +<script>
  36 +import { Vue, Component } from 'vue-property-decorator';
  37 +
  38 +@Component
  39 +export default class ListUsers extends Vue {
  40 + mounted() {
  41 +
  42 + }
  43 +}
  44 +</script>
codigos/frontend/src/router/index.ts 0 → 100644
@@ -0,0 +1,27 @@ @@ -0,0 +1,27 @@
  1 +import { route } from 'quasar/wrappers';
  2 +import VueRouter from 'vue-router';
  3 +import { Store } from 'vuex';
  4 +import {StateInterface} from '../store';
  5 +import routes from './routes';
  6 +
  7 +/*
  8 + * If not building with SSR mode, you can
  9 + * directly export the Router instantiation
  10 + */
  11 +
  12 +export default route<Store<StateInterface>>(({ Vue }) => {
  13 + Vue.use(VueRouter);
  14 +
  15 + const Router = new VueRouter({
  16 + scrollBehavior: () => ({ x: 0, y: 0 }),
  17 + routes,
  18 +
  19 + // Leave these as is and change from quasar.conf.js instead!
  20 + // quasar.conf.js -> build -> vueRouterMode
  21 + // quasar.conf.js -> build -> publicPath
  22 + mode: process.env.VUE_ROUTER_MODE,
  23 + base: process.env.VUE_ROUTER_BASE,
  24 + });
  25 +
  26 + return Router;
  27 +});
codigos/frontend/src/router/routes.ts 0 → 100644
@@ -0,0 +1,28 @@ @@ -0,0 +1,28 @@
  1 +import {RouteConfig} from 'vue-router';
  2 +
  3 +const routes: RouteConfig[] = [
  4 + {
  5 + path: '/',
  6 + component: () => import('layouts/MainLayout.vue'),
  7 + children: [
  8 + {path: '', component: () => import('pages/Index.vue')},
  9 + {path: 'projetos', component: () => import('pages/Projects.vue')},
  10 + {path: 'projetos/usuarios', component: () => import('pages/users/ListUsers.vue')}
  11 + ],
  12 + },
  13 + {
  14 + path: '/login',
  15 + component: () => import('layouts/LoginLayout.vue'),
  16 + children: [
  17 + {path: '', component: () => import('pages/Login.vue')},
  18 + ],
  19 + },
  20 + // Always leave this as last one,
  21 + // but you can also remove it
  22 + {
  23 + path: '*',
  24 + component: () => import('pages/Error404.vue'),
  25 + },
  26 +];
  27 +
  28 +export default routes;
codigos/frontend/src/services/AdminService.ts 0 → 100644
@@ -0,0 +1,18 @@ @@ -0,0 +1,18 @@
  1 +import Admin from "src/models/Admin";
  2 +import notify, {TypeMessage} from "src/mixins/notification";
  3 +import DefaultService from "src/services/DefaultService";
  4 +
  5 +export default class AdminService extends DefaultService<Admin>{
  6 +
  7 + public async find(id: number) {
  8 + try {
  9 + const resp = await this.client.get('/users/admins', id);
  10 + return new Admin(
  11 + id, resp.name,
  12 + resp.login, resp.email
  13 + );
  14 + } catch (e) {
  15 + notify('Não foi possível encontrar seus dados da conta', TypeMessage.error);
  16 + }
  17 + }
  18 +}
codigos/frontend/src/services/AuthApiService.ts 0 → 100644
@@ -0,0 +1,30 @@ @@ -0,0 +1,30 @@
  1 +import Login from "src/models/Login";
  2 +import notify, {TypeMessage} from "src/mixins/notification";
  3 +
  4 +import jwt from "jsonwebtoken";
  5 +import DefaultService from "src/services/DefaultService";
  6 +
  7 +export default class AuthApiService extends DefaultService<Login> {
  8 +
  9 + public async generateJwt(loginForm: Login) {
  10 + try {
  11 + const tokenData = await this.client.post('auth', loginForm);
  12 + return tokenData.token;
  13 + } catch (e) {
  14 + notify('Não foi possível autenticar na API', TypeMessage.error);
  15 + }
  16 + }
  17 +
  18 + public verifyToken(token: string | null) {
  19 + if (token === null) return false;
  20 +
  21 + try {
  22 + jwt.verify(token, Buffer.from('VGFrZSBPbiBNZSBUYWtlIE1lIE9u', 'base64'), {
  23 + subject: 'Hybrid Recommendation System - SRH'
  24 + })
  25 + return true;
  26 + } catch (e) {
  27 + return false;
  28 + }
  29 + };
  30 +}
codigos/frontend/src/services/DefaultService.ts 0 → 100644
@@ -0,0 +1,36 @@ @@ -0,0 +1,36 @@
  1 +import Client from "src/services/webClient/Client";
  2 +import FormRequest from "src/models/FormRequest";
  3 +import notify, {TypeMessage} from "src/mixins/notification";
  4 +import {ParseItem} from "src/models/models";
  5 +
  6 +export default abstract class DefaultService<T extends FormRequest> {
  7 + public client: Client<T>
  8 +
  9 + public constructor() {
  10 + this.client = new Client<T>();
  11 + }
  12 +
  13 + public handleErrors(response: any, resource: T) {
  14 + if (response.status === 422) {
  15 + for(let i = 0; i < response.data.length; i++) {
  16 + console.log(response.data[i]);
  17 +
  18 + notify(`
  19 + (Campo: ${this.translateFields(response.data[i].error, resource.parseNames)})
  20 + ${response.data[i].field}`, TypeMessage.error);
  21 + }
  22 + }
  23 + }
  24 +
  25 + private translateFields(fieldName: string, fieldsTranslation: ParseItem[]) {
  26 + let translateField: string | boolean = false;
  27 +
  28 + fieldsTranslation.forEach(translationObject => {
  29 + if (translationObject.fieldName === fieldName) {
  30 + translateField = translationObject.translation;
  31 + }
  32 + });
  33 +
  34 + return translateField ? translateField : fieldName;
  35 + }
  36 +}
codigos/frontend/src/services/LoginService.ts 0 → 100644
@@ -0,0 +1,27 @@ @@ -0,0 +1,27 @@
  1 +import Login from "src/models/Login";
  2 +import notify, {TypeMessage} from "src/mixins/notification";
  3 +
  4 +// @ts-ignore
  5 +import {Store} from "src/store";
  6 +import DefaultService from "src/services/DefaultService";
  7 +
  8 +export default class LoginService extends DefaultService<Login>{
  9 +
  10 + async login(username: string, password: string) {
  11 + const loginForm = new Login(username, password);
  12 +
  13 + try {
  14 + const resp = await this.client.post('/admins/login', loginForm);
  15 +
  16 + if (resp.validUser) {
  17 + // @ts-ignore
  18 + Store.commit('login/defineUserId', resp.userId);
  19 + notify('Login realizado com sucesso!', TypeMessage.success);
  20 + return true;
  21 + }
  22 + } catch (e) {
  23 + notify('Não foi possível realizar o login', TypeMessage.error);
  24 + return false;
  25 + }
  26 + }
  27 +}
codigos/frontend/src/services/ProjectService.ts 0 → 100644
@@ -0,0 +1,38 @@ @@ -0,0 +1,38 @@
  1 +import DefaultService from "src/services/DefaultService";
  2 +import Project from "src/models/Project";
  3 +import notify, {TypeMessage} from "src/mixins/notification";
  4 +
  5 +export default class ProjectService extends DefaultService<Project>{
  6 + async findAll() {
  7 + try {
  8 + const resp = await this.client.list('/projects')
  9 + return resp._embedded.projects;
  10 + } catch (e) {
  11 + notify('Não foi possível buscar os projetos', TypeMessage.error);
  12 + return false;
  13 + }
  14 + }
  15 +
  16 + async create(project: Project) {
  17 + try {
  18 + const resp = await this.client.post('/projects', project);
  19 + notify('Projeto criado com sucesso', TypeMessage.success);
  20 + return resp.data;
  21 + } catch (e) {
  22 + this.handleErrors(e.response, project);
  23 + notify('Não foi possível criar o projeto', TypeMessage.error);
  24 + return false;
  25 + }
  26 + }
  27 +
  28 + async update(project: Project, id: number) {
  29 + try {
  30 + const resp = await this.client.put('/projects', id, project);
  31 + return resp.data;
  32 + } catch (e) {
  33 + this.handleErrors(e.response, project);
  34 + notify('Não foi possível alterar o projeto', TypeMessage.error);
  35 + return false;
  36 + }
  37 + }
  38 +}
codigos/frontend/src/services/UserService.ts 0 → 100644
@@ -0,0 +1,5 @@ @@ -0,0 +1,5 @@
  1 +import DefaultService from "./DefaultService";
  2 +
  3 +export default class UserService extends DefaultService<any>{
  4 +
  5 +}
codigos/frontend/src/services/webClient/Client.ts 0 → 100644
@@ -0,0 +1,40 @@ @@ -0,0 +1,40 @@
  1 +import axios, {AxiosInstance} from 'axios'
  2 +import FormRequest from "src/models/FormRequest";
  3 +// @ts-ignore
  4 +import {Store} from "src/store";
  5 +
  6 +export default class Client<T extends FormRequest> {
  7 + private client: AxiosInstance;
  8 +
  9 + constructor() {
  10 + // @ts-ignore
  11 + const token = Store.getters['login/getToken'];
  12 +
  13 + this.client = axios.create({
  14 + baseURL: 'http://localhost:8080',
  15 + headers: {
  16 + Authorization: 'Bearer ' + token
  17 + }
  18 + });
  19 + }
  20 +
  21 + public async get(uri: string, id: number) {
  22 + const resp = await this.client.get(`${uri}/${id}`);
  23 + return resp.data;
  24 + }
  25 +
  26 + public async list(uri: string) {
  27 + const resp = await this.client.get(uri);
  28 + return resp.data;
  29 + }
  30 +
  31 + public async post(uri: string, data: T) {
  32 + const resp = await this.client.post(uri, data.build());
  33 + return resp.data;
  34 + }
  35 +
  36 + public async put(uri: string, id: number, data: T) {
  37 + const resp = await this.client.put(`${uri}/${id}`, data.build())
  38 + return resp.data;
  39 + }
  40 +}
codigos/frontend/src/shims-vue.d.ts 0 → 100644
@@ -0,0 +1,6 @@ @@ -0,0 +1,6 @@
  1 +// Mocks all files ending in `.vue` showing them as plain Vue instances
  2 +declare module '*.vue' {
  3 + import Vue from 'vue';
  4 +
  5 + export default Vue;
  6 +}
codigos/frontend/src/store/index.ts 0 → 100644
@@ -0,0 +1,35 @@ @@ -0,0 +1,35 @@
  1 +import {store} from 'quasar/wrappers';
  2 +import Vuex from 'vuex';
  3 +
  4 +// @ts-ignore
  5 +import login from './login/index';
  6 +import navigationInfo from './navigationInfo/index';
  7 +// @ts-ignore
  8 +import {LoginStateInterface} from "src/store/login/state";
  9 +import {NavigationInfoStateInterface} from "src/store/navigationInfo/state";
  10 +
  11 +export interface StateInterface {
  12 + login: LoginStateInterface;
  13 + navigationInfo: NavigationInfoStateInterface;
  14 +}
  15 +
  16 +let Store = null;
  17 +
  18 +export default store(({ Vue }) => {
  19 + Vue.use(Vuex);
  20 +
  21 + Store = new Vuex.Store<StateInterface>({
  22 + modules: {
  23 + login,
  24 + navigationInfo
  25 + },
  26 +
  27 + // enable strict mode (adds overhead!)
  28 + // for dev mode only
  29 + strict: !!process.env.DEV,
  30 + });
  31 +
  32 + return Store;
  33 +});
  34 +
  35 +export {Store}
codigos/frontend/src/store/login/getters.ts 0 → 100644
@@ -0,0 +1,17 @@ @@ -0,0 +1,17 @@
  1 +import { GetterTree } from 'vuex';
  2 +import { StateInterface } from '../index';
  3 +import { LoginStateInterface } from './state';
  4 +
  5 +const getters: GetterTree<LoginStateInterface, StateInterface> = {
  6 + infoUsuario(state: any) {
  7 + return state.userLoginInfo;
  8 + },
  9 + getIdUsuario(state: any) {
  10 + return state.userLoginInfo.userId;
  11 + },
  12 + getToken(state: any) {
  13 + return state.userLoginInfo.token;
  14 + }
  15 +};
  16 +
  17 +export default getters;
codigos/frontend/src/store/login/index.ts 0 → 100644
@@ -0,0 +1,14 @@ @@ -0,0 +1,14 @@
  1 +import {Module} from 'vuex';
  2 +import {StateInterface} from '../index';
  3 +import state, {LoginStateInterface} from './state';
  4 +import getters from "src/store/login/getters";
  5 +import mutations from "src/store/login/mutations";
  6 +
  7 +const loginModule: Module<LoginStateInterface, StateInterface> = {
  8 + namespaced: true,
  9 + getters,
  10 + state,
  11 + mutations
  12 +}
  13 +
  14 +export default loginModule;
codigos/frontend/src/store/login/mutations.ts 0 → 100644
@@ -0,0 +1,13 @@ @@ -0,0 +1,13 @@
  1 +import { MutationTree } from 'vuex';
  2 +import {LoginStateInterface} from './state';
  3 +
  4 +const mutation: MutationTree<LoginStateInterface> = {
  5 + defineToken(state: any, token) {
  6 + state.userLoginInfo.token = token;
  7 + },
  8 + defineUserId(state: any, id: number | null) {
  9 + state.userLoginInfo.userId = id;
  10 + }
  11 +};
  12 +
  13 +export default mutation;
codigos/frontend/src/store/login/state.ts 0 → 100644
@@ -0,0 +1,17 @@ @@ -0,0 +1,17 @@
  1 +interface Login {
  2 + userId: Number | null,
  3 + token: String | null
  4 +}
  5 +
  6 +export interface LoginStateInterface {
  7 + userLoginInfo: Login;
  8 +}
  9 +
  10 +const state: LoginStateInterface = {
  11 + userLoginInfo: {
  12 + userId: null,
  13 + token: null
  14 + },
  15 +};
  16 +
  17 +export default state;
codigos/frontend/src/store/module-example/actions.ts 0 → 100644
@@ -0,0 +1,11 @@ @@ -0,0 +1,11 @@
  1 +import { ActionTree } from 'vuex';
  2 +import { StateInterface } from '../index';
  3 +import { ExampleStateInterface } from './state';
  4 +
  5 +const actions: ActionTree<ExampleStateInterface, StateInterface> = {
  6 + someAction(/* context */) {
  7 + // your code
  8 + },
  9 +};
  10 +
  11 +export default actions;
codigos/frontend/src/store/module-example/getters.ts 0 → 100644
@@ -0,0 +1,11 @@ @@ -0,0 +1,11 @@
  1 +import { GetterTree } from 'vuex';
  2 +import { StateInterface } from '../index';
  3 +import { ExampleStateInterface } from './state';
  4 +
  5 +const getters: GetterTree<ExampleStateInterface, StateInterface> = {
  6 + someAction(/* context */) {
  7 + // your code
  8 + },
  9 +};
  10 +
  11 +export default getters;
codigos/frontend/src/store/module-example/index.ts 0 → 100644
@@ -0,0 +1,16 @@ @@ -0,0 +1,16 @@
  1 +import { Module } from 'vuex';
  2 +import { StateInterface } from '../index';
  3 +import state, { ExampleStateInterface } from './state';
  4 +import actions from './actions';
  5 +import getters from './getters';
  6 +import mutations from './mutations';
  7 +
  8 +const exampleModule: Module<ExampleStateInterface, StateInterface> = {
  9 + namespaced: true,
  10 + actions,
  11 + getters,
  12 + mutations,
  13 + state,
  14 +};
  15 +
  16 +export default exampleModule;
codigos/frontend/src/store/module-example/mutations.ts 0 → 100644
@@ -0,0 +1,10 @@ @@ -0,0 +1,10 @@
  1 +import { MutationTree } from 'vuex';
  2 +import { ExampleStateInterface } from './state';
  3 +
  4 +const mutation: MutationTree<ExampleStateInterface> = {
  5 + someMutation(/* state: ExampleStateInterface */) {
  6 + // your code
  7 + },
  8 +};
  9 +
  10 +export default mutation;
codigos/frontend/src/store/module-example/state.ts 0 → 100644
@@ -0,0 +1,9 @@ @@ -0,0 +1,9 @@
  1 +export interface ExampleStateInterface {
  2 + prop: boolean;
  3 +}
  4 +
  5 +const state: ExampleStateInterface = {
  6 + prop: false,
  7 +};
  8 +
  9 +export default state;
codigos/frontend/src/store/navigationInfo/getters.ts 0 → 100644
@@ -0,0 +1,11 @@ @@ -0,0 +1,11 @@
  1 +import { GetterTree } from 'vuex';
  2 +import { StateInterface } from '../index';
  3 +import {NavigationInfoStateInterface} from "src/store/navigationInfo/state";
  4 +
  5 +const getters: GetterTree<NavigationInfoStateInterface, StateInterface> = {
  6 + projectId(state: any) {
  7 + return state.navigationInfo.projectId;
  8 + },
  9 +};
  10 +
  11 +export default getters;
codigos/frontend/src/store/navigationInfo/index.ts 0 → 100644
@@ -0,0 +1,14 @@ @@ -0,0 +1,14 @@
  1 +import {Module} from 'vuex';
  2 +import {StateInterface} from '../index';
  3 +import state, {NavigationInfoStateInterface} from 'src/store/navigationInfo/state';
  4 +import getters from "src/store/navigationInfo/getters";
  5 +import mutations from "src/store/navigationInfo/mutations";
  6 +
  7 +const loginModule: Module<NavigationInfoStateInterface, StateInterface> = {
  8 + namespaced: true,
  9 + getters,
  10 + state,
  11 + mutations
  12 +}
  13 +
  14 +export default loginModule;
codigos/frontend/src/store/navigationInfo/mutations.ts 0 → 100644
@@ -0,0 +1,10 @@ @@ -0,0 +1,10 @@
  1 +import { MutationTree } from 'vuex';
  2 +import {NavigationInfoStateInterface} from 'src/store/navigationInfo/state';
  3 +
  4 +const mutation: MutationTree<NavigationInfoStateInterface> = {
  5 + defineProjectId(state: any, id: number | null) {
  6 + state.navigationInfo.projectId = id;
  7 + }
  8 +};
  9 +
  10 +export default mutation;
codigos/frontend/src/store/navigationInfo/state.ts 0 → 100644
@@ -0,0 +1,15 @@ @@ -0,0 +1,15 @@
  1 +interface NavigationInfo {
  2 + projectId: number | null
  3 +}
  4 +
  5 +export interface NavigationInfoStateInterface {
  6 + navigationInfo: NavigationInfo;
  7 +}
  8 +
  9 +const state: NavigationInfoStateInterface = {
  10 + navigationInfo: {
  11 + projectId: null
  12 + }
  13 +};
  14 +
  15 +export default state;
codigos/frontend/tsconfig.json 0 → 100644
@@ -0,0 +1,8 @@ @@ -0,0 +1,8 @@
  1 +{
  2 + "extends": "@quasar/app/tsconfig-preset",
  3 + "compilerOptions": {
  4 + "baseUrl": ".",
  5 + "experimentalDecorators": true
  6 + },
  7 + "strictPropertyInitialization": false
  8 +}
codigos/frontend/yarn.lock
@@ -10,44 +10,43 @@ @@ -10,44 +10,43 @@
10 "@babel/highlight" "^7.10.4" 10 "@babel/highlight" "^7.10.4"
11 11
12 "@babel/compat-data@^7.10.4": 12 "@babel/compat-data@^7.10.4":
13 - version "7.10.4"  
14 - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.10.4.tgz#706a6484ee6f910b719b696a9194f8da7d7ac241"  
15 - integrity sha512-t+rjExOrSVvjQQXNp5zAIYDp00KjdvGl/TpDX5REPr0S9IAIPQMTilcfG6q8c0QFmj9lSTVySV2VTsyggvtNIw== 13 + version "7.10.5"
  14 + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.10.5.tgz#d38425e67ea96b1480a3f50404d1bf85676301a6"
  15 + integrity sha512-mPVoWNzIpYJHbWje0if7Ck36bpbtTvIxOi9+6WSK9wjGEXearAqlwBoTQvVjsAY2VIwgcs8V940geY3okzRCEw==
16 dependencies: 16 dependencies:
17 browserslist "^4.12.0" 17 browserslist "^4.12.0"
18 invariant "^2.2.4" 18 invariant "^2.2.4"
19 semver "^5.5.0" 19 semver "^5.5.0"
20 20
21 "@babel/core@^7.9.0": 21 "@babel/core@^7.9.0":
22 - version "7.10.4"  
23 - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.10.4.tgz#780e8b83e496152f8dd7df63892b2e052bf1d51d"  
24 - integrity sha512-3A0tS0HWpy4XujGc7QtOIHTeNwUgWaZc/WuS5YQrfhU67jnVmsD6OGPc1AKHH0LJHQICGncy3+YUjIhVlfDdcA== 22 + version "7.10.5"
  23 + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.10.5.tgz#1f15e2cca8ad9a1d78a38ddba612f5e7cdbbd330"
  24 + integrity sha512-O34LQooYVDXPl7QWCdW9p4NR+QlzOr7xShPPJz8GsuCU3/8ua/wqTr7gmnxXv+WBESiGU/G5s16i6tUvHkNb+w==
25 dependencies: 25 dependencies:
26 "@babel/code-frame" "^7.10.4" 26 "@babel/code-frame" "^7.10.4"
27 - "@babel/generator" "^7.10.4"  
28 - "@babel/helper-module-transforms" "^7.10.4" 27 + "@babel/generator" "^7.10.5"
  28 + "@babel/helper-module-transforms" "^7.10.5"
29 "@babel/helpers" "^7.10.4" 29 "@babel/helpers" "^7.10.4"
30 - "@babel/parser" "^7.10.4" 30 + "@babel/parser" "^7.10.5"
31 "@babel/template" "^7.10.4" 31 "@babel/template" "^7.10.4"
32 - "@babel/traverse" "^7.10.4"  
33 - "@babel/types" "^7.10.4" 32 + "@babel/traverse" "^7.10.5"
  33 + "@babel/types" "^7.10.5"
34 convert-source-map "^1.7.0" 34 convert-source-map "^1.7.0"
35 debug "^4.1.0" 35 debug "^4.1.0"
36 gensync "^1.0.0-beta.1" 36 gensync "^1.0.0-beta.1"
37 json5 "^2.1.2" 37 json5 "^2.1.2"
38 - lodash "^4.17.13" 38 + lodash "^4.17.19"
39 resolve "^1.3.2" 39 resolve "^1.3.2"
40 semver "^5.4.1" 40 semver "^5.4.1"
41 source-map "^0.5.0" 41 source-map "^0.5.0"
42 42
43 -"@babel/generator@^7.10.4":  
44 - version "7.10.4"  
45 - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.10.4.tgz#e49eeed9fe114b62fa5b181856a43a5e32f5f243"  
46 - integrity sha512-toLIHUIAgcQygFZRAQcsLQV3CBuX6yOIru1kJk/qqqvcRmZrYe6WavZTSG+bB8MxhnL9YPf+pKQfuiP161q7ng== 43 +"@babel/generator@^7.10.5":
  44 + version "7.10.5"
  45 + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.10.5.tgz#1b903554bc8c583ee8d25f1e8969732e6b829a69"
  46 + integrity sha512-3vXxr3FEW7E7lJZiWQ3bM4+v/Vyr9C+hpolQ8BGFr9Y8Ri2tFLWTixmwKBafDujO1WVah4fhZBeU1bieKdghig==
47 dependencies: 47 dependencies:
48 - "@babel/types" "^7.10.4" 48 + "@babel/types" "^7.10.5"
49 jsesc "^2.5.1" 49 jsesc "^2.5.1"
50 - lodash "^4.17.13"  
51 source-map "^0.5.0" 50 source-map "^0.5.0"
52 51
53 "@babel/helper-annotate-as-pure@^7.10.4": 52 "@babel/helper-annotate-as-pure@^7.10.4":
@@ -76,13 +75,13 @@ @@ -76,13 +75,13 @@
76 levenary "^1.1.1" 75 levenary "^1.1.1"
77 semver "^5.5.0" 76 semver "^5.5.0"
78 77
79 -"@babel/helper-create-class-features-plugin@^7.10.4":  
80 - version "7.10.4"  
81 - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.4.tgz#2d4015d0136bd314103a70d84a7183e4b344a355"  
82 - integrity sha512-9raUiOsXPxzzLjCXeosApJItoMnX3uyT4QdM2UldffuGApNrF8e938MwNpDCK9CPoyxrEoCgT+hObJc3mZa6lQ== 78 +"@babel/helper-create-class-features-plugin@^7.10.4", "@babel/helper-create-class-features-plugin@^7.10.5":
  79 + version "7.10.5"
  80 + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.5.tgz#9f61446ba80e8240b0a5c85c6fdac8459d6f259d"
  81 + integrity sha512-0nkdeijB7VlZoLT3r/mY3bUkw3T8WG/hNw+FATs/6+pG2039IJWjTYL0VTISqsNHMUTEnwbVnc89WIJX9Qed0A==
83 dependencies: 82 dependencies:
84 "@babel/helper-function-name" "^7.10.4" 83 "@babel/helper-function-name" "^7.10.4"
85 - "@babel/helper-member-expression-to-functions" "^7.10.4" 84 + "@babel/helper-member-expression-to-functions" "^7.10.5"
86 "@babel/helper-optimise-call-expression" "^7.10.4" 85 "@babel/helper-optimise-call-expression" "^7.10.4"
87 "@babel/helper-plugin-utils" "^7.10.4" 86 "@babel/helper-plugin-utils" "^7.10.4"
88 "@babel/helper-replace-supers" "^7.10.4" 87 "@babel/helper-replace-supers" "^7.10.4"
@@ -98,13 +97,13 @@ @@ -98,13 +97,13 @@
98 regexpu-core "^4.7.0" 97 regexpu-core "^4.7.0"
99 98
100 "@babel/helper-define-map@^7.10.4": 99 "@babel/helper-define-map@^7.10.4":
101 - version "7.10.4"  
102 - resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.10.4.tgz#f037ad794264f729eda1889f4ee210b870999092"  
103 - integrity sha512-nIij0oKErfCnLUCWaCaHW0Bmtl2RO9cN7+u2QT8yqTywgALKlyUVOvHDElh+b5DwVC6YB1FOYFOTWcN/+41EDA== 100 + version "7.10.5"
  101 + resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.10.5.tgz#b53c10db78a640800152692b13393147acb9bb30"
  102 + integrity sha512-fMw4kgFB720aQFXSVaXr79pjjcW5puTCM16+rECJ/plGS+zByelE8l9nCpV1GibxTnFVmUuYG9U8wYfQHdzOEQ==
104 dependencies: 103 dependencies:
105 "@babel/helper-function-name" "^7.10.4" 104 "@babel/helper-function-name" "^7.10.4"
106 - "@babel/types" "^7.10.4"  
107 - lodash "^4.17.13" 105 + "@babel/types" "^7.10.5"
  106 + lodash "^4.17.19"
108 107
109 "@babel/helper-explode-assignable-expression@^7.10.4": 108 "@babel/helper-explode-assignable-expression@^7.10.4":
110 version "7.10.4" 109 version "7.10.4"
@@ -137,12 +136,12 @@ @@ -137,12 +136,12 @@
137 dependencies: 136 dependencies:
138 "@babel/types" "^7.10.4" 137 "@babel/types" "^7.10.4"
139 138
140 -"@babel/helper-member-expression-to-functions@^7.10.4":  
141 - version "7.10.4"  
142 - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.4.tgz#7cd04b57dfcf82fce9aeae7d4e4452fa31b8c7c4"  
143 - integrity sha512-m5j85pK/KZhuSdM/8cHUABQTAslV47OjfIB9Cc7P+PvlAoBzdb79BGNfw8RhT5Mq3p+xGd0ZfAKixbrUZx0C7A== 139 +"@babel/helper-member-expression-to-functions@^7.10.4", "@babel/helper-member-expression-to-functions@^7.10.5":
  140 + version "7.10.5"
  141 + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.5.tgz#172f56e7a63e78112f3a04055f24365af702e7ee"
  142 + integrity sha512-HiqJpYD5+WopCXIAbQDG0zye5XYVvcO9w/DHp5GsaGkRUaamLj2bEtu6i8rnGGprAhHM3qidCMgp71HF4endhA==
144 dependencies: 143 dependencies:
145 - "@babel/types" "^7.10.4" 144 + "@babel/types" "^7.10.5"
146 145
147 "@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.8.3": 146 "@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.8.3":
148 version "7.10.4" 147 version "7.10.4"
@@ -151,18 +150,18 @@ @@ -151,18 +150,18 @@
151 dependencies: 150 dependencies:
152 "@babel/types" "^7.10.4" 151 "@babel/types" "^7.10.4"
153 152
154 -"@babel/helper-module-transforms@^7.10.4":  
155 - version "7.10.4"  
156 - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.10.4.tgz#ca1f01fdb84e48c24d7506bb818c961f1da8805d"  
157 - integrity sha512-Er2FQX0oa3nV7eM1o0tNCTx7izmQtwAQsIiaLRWtavAAEcskb0XJ5OjJbVrYXWOTr8om921Scabn4/tzlx7j1Q== 153 +"@babel/helper-module-transforms@^7.10.4", "@babel/helper-module-transforms@^7.10.5":
  154 + version "7.10.5"
  155 + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.10.5.tgz#120c271c0b3353673fcdfd8c053db3c544a260d6"
  156 + integrity sha512-4P+CWMJ6/j1W915ITJaUkadLObmCRRSC234uctJfn/vHrsLNxsR8dwlcXv9ZhJWzl77awf+mWXSZEKt5t0OnlA==
158 dependencies: 157 dependencies:
159 "@babel/helper-module-imports" "^7.10.4" 158 "@babel/helper-module-imports" "^7.10.4"
160 "@babel/helper-replace-supers" "^7.10.4" 159 "@babel/helper-replace-supers" "^7.10.4"
161 "@babel/helper-simple-access" "^7.10.4" 160 "@babel/helper-simple-access" "^7.10.4"
162 "@babel/helper-split-export-declaration" "^7.10.4" 161 "@babel/helper-split-export-declaration" "^7.10.4"
163 "@babel/template" "^7.10.4" 162 "@babel/template" "^7.10.4"
164 - "@babel/types" "^7.10.4"  
165 - lodash "^4.17.13" 163 + "@babel/types" "^7.10.5"
  164 + lodash "^4.17.19"
166 165
167 "@babel/helper-optimise-call-expression@^7.10.4": 166 "@babel/helper-optimise-call-expression@^7.10.4":
168 version "7.10.4" 167 version "7.10.4"
@@ -177,11 +176,11 @@ @@ -177,11 +176,11 @@
177 integrity sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg== 176 integrity sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==
178 177
179 "@babel/helper-regex@^7.10.4": 178 "@babel/helper-regex@^7.10.4":
180 - version "7.10.4"  
181 - resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.10.4.tgz#59b373daaf3458e5747dece71bbaf45f9676af6d"  
182 - integrity sha512-inWpnHGgtg5NOF0eyHlC0/74/VkdRITY9dtTpB2PrxKKn+AkVMRiZz/Adrx+Ssg+MLDesi2zohBW6MVq6b4pOQ== 179 + version "7.10.5"
  180 + resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.10.5.tgz#32dfbb79899073c415557053a19bd055aae50ae0"
  181 + integrity sha512-68kdUAzDrljqBrio7DYAEgCoJHxppJOERHOgOrDN7WjOzP0ZQ1LsSDRXcemzVZaLvjaJsJEESb6qt+znNuENDg==
183 dependencies: 182 dependencies:
184 - lodash "^4.17.13" 183 + lodash "^4.17.19"
185 184
186 "@babel/helper-remap-async-to-generator@^7.10.4": 185 "@babel/helper-remap-async-to-generator@^7.10.4":
187 version "7.10.4" 186 version "7.10.4"
@@ -252,15 +251,15 @@ @@ -252,15 +251,15 @@
252 chalk "^2.0.0" 251 chalk "^2.0.0"
253 js-tokens "^4.0.0" 252 js-tokens "^4.0.0"
254 253
255 -"@babel/parser@^7.10.4", "@babel/parser@^7.7.0":  
256 - version "7.10.4"  
257 - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.10.4.tgz#9eedf27e1998d87739fb5028a5120557c06a1a64"  
258 - integrity sha512-8jHII4hf+YVDsskTF6WuMB3X4Eh+PsUkC2ljq22so5rHvH+T8BzyL94VOdyFLNR8tBSVXOTbNHOKpR4TfRxVtA== 254 +"@babel/parser@^7.10.4", "@babel/parser@^7.10.5", "@babel/parser@^7.7.0":
  255 + version "7.10.5"
  256 + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.10.5.tgz#e7c6bf5a7deff957cec9f04b551e2762909d826b"
  257 + integrity sha512-wfryxy4bE1UivvQKSQDU4/X6dr+i8bctjUjj8Zyt3DQy7NtPizJXT8M52nqpNKL+nq2PW8lxk4ZqLj0fD4B4hQ==
259 258
260 "@babel/plugin-proposal-async-generator-functions@^7.10.4": 259 "@babel/plugin-proposal-async-generator-functions@^7.10.4":
261 - version "7.10.4"  
262 - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.4.tgz#4b65abb3d9bacc6c657aaa413e56696f9f170fc6"  
263 - integrity sha512-MJbxGSmejEFVOANAezdO39SObkURO5o/8b6fSH6D1pi9RZQt+ldppKPXfqgUWpSQ9asM6xaSaSJIaeWMDRP0Zg== 260 + version "7.10.5"
  261 + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.5.tgz#3491cabf2f7c179ab820606cec27fed15e0e8558"
  262 + integrity sha512-cNMCVezQbrRGvXJwm9fu/1sJj9bHdGAgKodZdLqOQIpfoH3raqmRPBM17+lh7CzhiKRRBrGtZL9WcjxSoGYUSg==
264 dependencies: 263 dependencies:
265 "@babel/helper-plugin-utils" "^7.10.4" 264 "@babel/helper-plugin-utils" "^7.10.4"
266 "@babel/helper-remap-async-to-generator" "^7.10.4" 265 "@babel/helper-remap-async-to-generator" "^7.10.4"
@@ -275,11 +274,11 @@ @@ -275,11 +274,11 @@
275 "@babel/helper-plugin-utils" "^7.10.4" 274 "@babel/helper-plugin-utils" "^7.10.4"
276 275
277 "@babel/plugin-proposal-decorators@^7.4.4": 276 "@babel/plugin-proposal-decorators@^7.4.4":
278 - version "7.10.4"  
279 - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.10.4.tgz#fe20ef10cc73f386f70910fca48798041cd357c7"  
280 - integrity sha512-JHTWjQngOPv+ZQQqOGv2x6sCCr4IYWy7S1/VH6BE9ZfkoLrdQ2GpEP3tfb5M++G9PwvqjhY8VC/C3tXm+/eHvA== 277 + version "7.10.5"
  278 + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.10.5.tgz#42898bba478bc4b1ae242a703a953a7ad350ffb4"
  279 + integrity sha512-Sc5TAQSZuLzgY0664mMDn24Vw2P8g/VhyLyGPaWiHahhgLqeZvcGeyBZOrJW0oSKIK2mvQ22a1ENXBIQLhrEiQ==
281 dependencies: 280 dependencies:
282 - "@babel/helper-create-class-features-plugin" "^7.10.4" 281 + "@babel/helper-create-class-features-plugin" "^7.10.5"
283 "@babel/helper-plugin-utils" "^7.10.4" 282 "@babel/helper-plugin-utils" "^7.10.4"
284 "@babel/plugin-syntax-decorators" "^7.10.4" 283 "@babel/plugin-syntax-decorators" "^7.10.4"
285 284
@@ -510,12 +509,11 @@ @@ -510,12 +509,11 @@
510 "@babel/helper-plugin-utils" "^7.10.4" 509 "@babel/helper-plugin-utils" "^7.10.4"
511 510
512 "@babel/plugin-transform-block-scoping@^7.10.4": 511 "@babel/plugin-transform-block-scoping@^7.10.4":
513 - version "7.10.4"  
514 - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.10.4.tgz#a670d1364bb5019a621b9ea2001482876d734787"  
515 - integrity sha512-J3b5CluMg3hPUii2onJDRiaVbPtKFPLEaV5dOPY5OeAbDi1iU/UbbFFTgwb7WnanaDy7bjU35kc26W3eM5Qa0A== 512 + version "7.10.5"
  513 + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.10.5.tgz#b81b8aafefbfe68f0f65f7ef397b9ece68a6037d"
  514 + integrity sha512-6Ycw3hjpQti0qssQcA6AMSFDHeNJ++R6dIMnpRqUjFeBBTmTDPa8zgF90OVfTvAo11mXZTlVUViY1g8ffrURLg==
516 dependencies: 515 dependencies:
517 "@babel/helper-plugin-utils" "^7.10.4" 516 "@babel/helper-plugin-utils" "^7.10.4"
518 - lodash "^4.17.13"  
519 517
520 "@babel/plugin-transform-classes@^7.10.4": 518 "@babel/plugin-transform-classes@^7.10.4":
521 version "7.10.4" 519 version "7.10.4"
@@ -598,11 +596,11 @@ @@ -598,11 +596,11 @@
598 "@babel/helper-plugin-utils" "^7.10.4" 596 "@babel/helper-plugin-utils" "^7.10.4"
599 597
600 "@babel/plugin-transform-modules-amd@^7.10.4": 598 "@babel/plugin-transform-modules-amd@^7.10.4":
601 - version "7.10.4"  
602 - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.10.4.tgz#cb407c68b862e4c1d13a2fc738c7ec5ed75fc520"  
603 - integrity sha512-3Fw+H3WLUrTlzi3zMiZWp3AR4xadAEMv6XRCYnd5jAlLM61Rn+CRJaZMaNvIpcJpQ3vs1kyifYvEVPFfoSkKOA== 599 + version "7.10.5"
  600 + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.10.5.tgz#1b9cddaf05d9e88b3aad339cb3e445c4f020a9b1"
  601 + integrity sha512-elm5uruNio7CTLFItVC/rIzKLfQ17+fX7EVz5W0TMgIHFo1zY0Ozzx+lgwhL4plzl8OzVn6Qasx5DeEFyoNiRw==
604 dependencies: 602 dependencies:
605 - "@babel/helper-module-transforms" "^7.10.4" 603 + "@babel/helper-module-transforms" "^7.10.5"
606 "@babel/helper-plugin-utils" "^7.10.4" 604 "@babel/helper-plugin-utils" "^7.10.4"
607 babel-plugin-dynamic-import-node "^2.3.3" 605 babel-plugin-dynamic-import-node "^2.3.3"
608 606
@@ -617,12 +615,12 @@ @@ -617,12 +615,12 @@
617 babel-plugin-dynamic-import-node "^2.3.3" 615 babel-plugin-dynamic-import-node "^2.3.3"
618 616
619 "@babel/plugin-transform-modules-systemjs@^7.10.4": 617 "@babel/plugin-transform-modules-systemjs@^7.10.4":
620 - version "7.10.4"  
621 - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.10.4.tgz#8f576afd943ac2f789b35ded0a6312f929c633f9"  
622 - integrity sha512-Tb28LlfxrTiOTGtZFsvkjpyjCl9IoaRI52AEU/VIwOwvDQWtbNJsAqTXzh+5R7i74e/OZHH2c2w2fsOqAfnQYQ== 618 + version "7.10.5"
  619 + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.10.5.tgz#6270099c854066681bae9e05f87e1b9cadbe8c85"
  620 + integrity sha512-f4RLO/OL14/FP1AEbcsWMzpbUz6tssRaeQg11RH1BP/XnPpRoVwgeYViMFacnkaw4k4wjRSjn3ip1Uw9TaXuMw==
623 dependencies: 621 dependencies:
624 "@babel/helper-hoist-variables" "^7.10.4" 622 "@babel/helper-hoist-variables" "^7.10.4"
625 - "@babel/helper-module-transforms" "^7.10.4" 623 + "@babel/helper-module-transforms" "^7.10.5"
626 "@babel/helper-plugin-utils" "^7.10.4" 624 "@babel/helper-plugin-utils" "^7.10.4"
627 babel-plugin-dynamic-import-node "^2.3.3" 625 babel-plugin-dynamic-import-node "^2.3.3"
628 626
@@ -657,9 +655,9 @@ @@ -657,9 +655,9 @@
657 "@babel/helper-replace-supers" "^7.10.4" 655 "@babel/helper-replace-supers" "^7.10.4"
658 656
659 "@babel/plugin-transform-parameters@^7.10.4": 657 "@babel/plugin-transform-parameters@^7.10.4":
660 - version "7.10.4"  
661 - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.10.4.tgz#7b4d137c87ea7adc2a0f3ebf53266871daa6fced"  
662 - integrity sha512-RurVtZ/D5nYfEg0iVERXYKEgDFeesHrHfx8RT05Sq57ucj2eOYAP6eu5fynL4Adju4I/mP/I6SO0DqNWAXjfLQ== 658 + version "7.10.5"
  659 + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.10.5.tgz#59d339d58d0b1950435f4043e74e2510005e2c4a"
  660 + integrity sha512-xPHwUj5RdFV8l1wuYiu5S9fqWGM2DrYc24TMvUiRrPVm+SM3XeqU9BcokQX/kEUe+p2RBwy+yoiR1w/Blq6ubw==
663 dependencies: 661 dependencies:
664 "@babel/helper-get-function-arity" "^7.10.4" 662 "@babel/helper-get-function-arity" "^7.10.4"
665 "@babel/helper-plugin-utils" "^7.10.4" 663 "@babel/helper-plugin-utils" "^7.10.4"
@@ -686,9 +684,9 @@ @@ -686,9 +684,9 @@
686 "@babel/helper-plugin-utils" "^7.10.4" 684 "@babel/helper-plugin-utils" "^7.10.4"
687 685
688 "@babel/plugin-transform-runtime@^7.9.0": 686 "@babel/plugin-transform-runtime@^7.9.0":
689 - version "7.10.4"  
690 - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.10.4.tgz#594fb53453ea1b6f0779cceb48ce0718a447feb7"  
691 - integrity sha512-8ULlGv8p+Vuxu+kz2Y1dk6MYS2b/Dki+NO6/0ZlfSj5tMalfDL7jI/o/2a+rrWLqSXvnadEqc2WguB4gdQIxZw== 687 + version "7.10.5"
  688 + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.10.5.tgz#3b39b7b24830e0c2d8ff7a4489fe5cf99fbace86"
  689 + integrity sha512-tV4V/FjElJ9lQtyjr5xD2IFFbgY46r7EeVu5a8CpEKT5laheHKSlFeHjpkPppW3PqzGLAuv5k2qZX5LgVZIX5w==
692 dependencies: 690 dependencies:
693 "@babel/helper-module-imports" "^7.10.4" 691 "@babel/helper-module-imports" "^7.10.4"
694 "@babel/helper-plugin-utils" "^7.10.4" 692 "@babel/helper-plugin-utils" "^7.10.4"
@@ -718,9 +716,9 @@ @@ -718,9 +716,9 @@
718 "@babel/helper-regex" "^7.10.4" 716 "@babel/helper-regex" "^7.10.4"
719 717
720 "@babel/plugin-transform-template-literals@^7.10.4": 718 "@babel/plugin-transform-template-literals@^7.10.4":
721 - version "7.10.4"  
722 - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.4.tgz#e6375407b30fcb7fcfdbba3bb98ef3e9d36df7bc"  
723 - integrity sha512-4NErciJkAYe+xI5cqfS8pV/0ntlY5N5Ske/4ImxAVX7mk9Rxt2bwDTGv1Msc2BRJvWQcmYEC+yoMLdX22aE4VQ== 719 + version "7.10.5"
  720 + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.5.tgz#78bc5d626a6642db3312d9d0f001f5e7639fde8c"
  721 + integrity sha512-V/lnPGIb+KT12OQikDvgSuesRX14ck5FfJXt6+tXhdkJ+Vsd0lDCVtF6jcB4rNClYFzaB2jusZ+lNISDk2mMMw==
724 dependencies: 722 dependencies:
725 "@babel/helper-annotate-as-pure" "^7.10.4" 723 "@babel/helper-annotate-as-pure" "^7.10.4"
726 "@babel/helper-plugin-utils" "^7.10.4" 724 "@babel/helper-plugin-utils" "^7.10.4"
@@ -829,9 +827,9 @@ @@ -829,9 +827,9 @@
829 esutils "^2.0.2" 827 esutils "^2.0.2"
830 828
831 "@babel/runtime@^7.8.4", "@babel/runtime@^7.9.0": 829 "@babel/runtime@^7.8.4", "@babel/runtime@^7.9.0":
832 - version "7.10.4"  
833 - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.10.4.tgz#a6724f1a6b8d2f6ea5236dbfe58c7d7ea9c5eb99"  
834 - integrity sha512-UpTN5yUJr9b4EX2CnGNWIvER7Ab83ibv0pcvvHc4UOdrBI5jb8bj+32cCwPX6xu0mt2daFNjYhoi+X7beH0RSw== 830 + version "7.10.5"
  831 + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.10.5.tgz#303d8bd440ecd5a491eae6117fd3367698674c5c"
  832 + integrity sha512-otddXKhdNn7d0ptoFRHtMLa8LqDxLYwTjB4nYgM1yy5N6gU/MUf8zqyyLltCH3yAVitBzmwK4us+DD0l/MauAg==
835 dependencies: 833 dependencies:
836 regenerator-runtime "^0.13.4" 834 regenerator-runtime "^0.13.4"
837 835
@@ -844,28 +842,28 @@ @@ -844,28 +842,28 @@
844 "@babel/parser" "^7.10.4" 842 "@babel/parser" "^7.10.4"
845 "@babel/types" "^7.10.4" 843 "@babel/types" "^7.10.4"
846 844
847 -"@babel/traverse@^7.10.4", "@babel/traverse@^7.7.0":  
848 - version "7.10.4"  
849 - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.10.4.tgz#e642e5395a3b09cc95c8e74a27432b484b697818"  
850 - integrity sha512-aSy7p5THgSYm4YyxNGz6jZpXf+Ok40QF3aA2LyIONkDHpAcJzDUqlCKXv6peqYUs2gmic849C/t2HKw2a2K20Q== 845 +"@babel/traverse@^7.10.4", "@babel/traverse@^7.10.5", "@babel/traverse@^7.7.0":
  846 + version "7.10.5"
  847 + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.10.5.tgz#77ce464f5b258be265af618d8fddf0536f20b564"
  848 + integrity sha512-yc/fyv2gUjPqzTz0WHeRJH2pv7jA9kA7mBX2tXl/x5iOE81uaVPuGPtaYk7wmkx4b67mQ7NqI8rmT2pF47KYKQ==
851 dependencies: 849 dependencies:
852 "@babel/code-frame" "^7.10.4" 850 "@babel/code-frame" "^7.10.4"
853 - "@babel/generator" "^7.10.4" 851 + "@babel/generator" "^7.10.5"
854 "@babel/helper-function-name" "^7.10.4" 852 "@babel/helper-function-name" "^7.10.4"
855 "@babel/helper-split-export-declaration" "^7.10.4" 853 "@babel/helper-split-export-declaration" "^7.10.4"
856 - "@babel/parser" "^7.10.4"  
857 - "@babel/types" "^7.10.4" 854 + "@babel/parser" "^7.10.5"
  855 + "@babel/types" "^7.10.5"
858 debug "^4.1.0" 856 debug "^4.1.0"
859 globals "^11.1.0" 857 globals "^11.1.0"
860 - lodash "^4.17.13" 858 + lodash "^4.17.19"
861 859
862 -"@babel/types@^7.10.4", "@babel/types@^7.4.4", "@babel/types@^7.7.0":  
863 - version "7.10.4"  
864 - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.10.4.tgz#369517188352e18219981efd156bfdb199fff1ee"  
865 - integrity sha512-UTCFOxC3FsFHb7lkRMVvgLzaRVamXuAs2Tz4wajva4WxtVY82eZeaUBtC2Zt95FU9TiznuC0Zk35tsim8jeVpg== 860 +"@babel/types@^7.10.4", "@babel/types@^7.10.5", "@babel/types@^7.4.4", "@babel/types@^7.7.0":
  861 + version "7.10.5"
  862 + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.10.5.tgz#d88ae7e2fde86bfbfe851d4d81afa70a997b5d15"
  863 + integrity sha512-ixV66KWfCI6GKoA/2H9v6bQdbfXEwwpOdQ8cRvb4F+eyvhlaHxWFMQB4+3d9QFJXZsiiiqVrewNV0DFEQpyT4Q==
866 dependencies: 864 dependencies:
867 "@babel/helper-validator-identifier" "^7.10.4" 865 "@babel/helper-validator-identifier" "^7.10.4"
868 - lodash "^4.17.13" 866 + lodash "^4.17.19"
869 to-fast-properties "^2.0.0" 867 to-fast-properties "^2.0.0"
870 868
871 "@electron/get@^1.3.1": 869 "@electron/get@^1.3.1":
@@ -918,9 +916,9 @@ @@ -918,9 +916,9 @@
918 integrity sha1-FPzHEqUwA475vhzmlSMVqDn0Zqg= 916 integrity sha1-FPzHEqUwA475vhzmlSMVqDn0Zqg=
919 917
920 "@quasar/app@^2.0.0": 918 "@quasar/app@^2.0.0":
921 - version "2.0.4"  
922 - resolved "https://registry.yarnpkg.com/@quasar/app/-/app-2.0.4.tgz#b68043c9db445cc6dfa5be4649b986bf105b75ef"  
923 - integrity sha512-OesnQeFezPjds7gvFR6TJR1rE6en4Oz80Xsl/0HnG8yGx5wmFRF8R5gJsqeiCeFS3AIhcQ1lDWamh885YBlBAQ== 919 + version "2.0.6"
  920 + resolved "https://registry.yarnpkg.com/@quasar/app/-/app-2.0.6.tgz#4462da617b3b1d4c405bd57bc8a92d9b4109eace"
  921 + integrity sha512-4A98sb9Y4NPPrIPo7HXJABUzptHp3ji87hD2wDQxpzijhhJmEJpDSiWZR3o3ngP8j/eP3mqJeYbCnXbB6ZnyuA==
924 dependencies: 922 dependencies:
925 "@quasar/babel-preset-app" "2.0.1" 923 "@quasar/babel-preset-app" "2.0.1"
926 "@quasar/fastclick" "1.1.4" 924 "@quasar/fastclick" "1.1.4"
@@ -1027,9 +1025,9 @@ @@ -1027,9 +1025,9 @@
1027 core-js-compat "^3.6.5" 1025 core-js-compat "^3.6.5"
1028 1026
1029 "@quasar/extras@^1.0.0": 1027 "@quasar/extras@^1.0.0":
1030 - version "1.8.2"  
1031 - resolved "https://registry.yarnpkg.com/@quasar/extras/-/extras-1.8.2.tgz#54ff5e0c8fc17763c083c4f0dcd3a60e1b00b4a8"  
1032 - integrity sha512-y3A4OO4DGDxuFyh/X4k5fS17TTxhpPauZv8Qr/0bso+RTk5f+3X4lLAcP7aaiqcBLOV8HsUKpGzNArMleClYgg== 1028 + version "1.9.2"
  1029 + resolved "https://registry.yarnpkg.com/@quasar/extras/-/extras-1.9.2.tgz#088b4c6e2d8d0ae625cad311e9c0f9502cab11e2"
  1030 + integrity sha512-OP2qTOveQHkTmaxsEhSPhXTs3s0MxGevIjQMZ8e79U3HhlGYSO48wBH2iUrK5c6XlALOq9zqHQJoGt5QnhWdUA==
1033 1031
1034 "@quasar/fastclick@1.1.4": 1032 "@quasar/fastclick@1.1.4":
1035 version "1.1.4" 1033 version "1.1.4"
@@ -1096,10 +1094,15 @@ @@ -1096,10 +1094,15 @@
1096 electron-notarize "^0.1.1" 1094 electron-notarize "^0.1.1"
1097 electron-osx-sign "^0.4.11" 1095 electron-osx-sign "^0.4.11"
1098 1096
  1097 +"@types/eslint-visitor-keys@^1.0.0":
  1098 + version "1.0.0"
  1099 + resolved "https://registry.yarnpkg.com/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#1ee30d79544ca84d68d4b3cdb0af4f205663dd2d"
  1100 + integrity sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==
  1101 +
1099 "@types/express-serve-static-core@*": 1102 "@types/express-serve-static-core@*":
1100 - version "4.17.8"  
1101 - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.8.tgz#b8f7b714138536742da222839892e203df569d1c"  
1102 - integrity sha512-1SJZ+R3Q/7mLkOD9ewCBDYD2k0WyZQtWYqF/2VvoNN2/uhI49J9CDN4OAm+wGMA0DbArA4ef27xl4+JwMtGggw== 1103 + version "4.17.9"
  1104 + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.9.tgz#2d7b34dcfd25ec663c25c85d76608f8b249667f1"
  1105 + integrity sha512-DG0BYg6yO+ePW+XoDENYz8zhNGC3jDDEpComMYn7WJc4mY1Us8Rw9ax2YhJXxpyk2SF47PQAoQ0YyVT1a0bEkA==
1103 dependencies: 1106 dependencies:
1104 "@types/node" "*" 1107 "@types/node" "*"
1105 "@types/qs" "*" 1108 "@types/qs" "*"
@@ -1154,7 +1157,7 @@ @@ -1154,7 +1157,7 @@
1154 dependencies: 1157 dependencies:
1155 "@types/node" "*" 1158 "@types/node" "*"
1156 1159
1157 -"@types/json-schema@^7.0.4": 1160 +"@types/json-schema@^7.0.3", "@types/json-schema@^7.0.4":
1158 version "7.0.5" 1161 version "7.0.5"
1159 resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.5.tgz#dcce4430e64b443ba8945f0290fb564ad5bac6dd" 1162 resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.5.tgz#dcce4430e64b443ba8945f0290fb564ad5bac6dd"
1160 integrity sha512-7+2BITlgjgDhH0vvwZU/HZJVyk+2XUlvxXe8dFMedNX/aMkaOq++rMAFXc0tM7ij15QaWlbdQASBR9dihi+bDQ== 1163 integrity sha512-7+2BITlgjgDhH0vvwZU/HZJVyk+2XUlvxXe8dFMedNX/aMkaOq++rMAFXc0tM7ij15QaWlbdQASBR9dihi+bDQ==
@@ -1164,15 +1167,22 @@ @@ -1164,15 +1167,22 @@
1164 resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" 1167 resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee"
1165 integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= 1168 integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4=
1166 1169
  1170 +"@types/jsonwebtoken@^8.5.0":
  1171 + version "8.5.0"
  1172 + resolved "https://registry.yarnpkg.com/@types/jsonwebtoken/-/jsonwebtoken-8.5.0.tgz#2531d5e300803aa63279b232c014acf780c981c5"
  1173 + integrity sha512-9bVao7LvyorRGZCw0VmH/dr7Og+NdjYSsKAxB43OQoComFbBgsEpoR9JW6+qSq/ogwVBg8GI2MfAlk4SYI4OLg==
  1174 + dependencies:
  1175 + "@types/node" "*"
  1176 +
1167 "@types/lru-cache@5.1.0": 1177 "@types/lru-cache@5.1.0":
1168 version "5.1.0" 1178 version "5.1.0"
1169 resolved "https://registry.yarnpkg.com/@types/lru-cache/-/lru-cache-5.1.0.tgz#57f228f2b80c046b4a1bd5cac031f81f207f4f03" 1179 resolved "https://registry.yarnpkg.com/@types/lru-cache/-/lru-cache-5.1.0.tgz#57f228f2b80c046b4a1bd5cac031f81f207f4f03"
1170 integrity sha512-RaE0B+14ToE4l6UqdarKPnXwVDuigfFv+5j9Dze/Nqr23yyuqdNvzcZi3xB+3Agvi5R4EOgAksfv3lXX4vBt9w== 1180 integrity sha512-RaE0B+14ToE4l6UqdarKPnXwVDuigfFv+5j9Dze/Nqr23yyuqdNvzcZi3xB+3Agvi5R4EOgAksfv3lXX4vBt9w==
1171 1181
1172 "@types/mime@*": 1182 "@types/mime@*":
1173 - version "2.0.2"  
1174 - resolved "https://registry.yarnpkg.com/@types/mime/-/mime-2.0.2.tgz#857a118d8634c84bba7ae14088e4508490cd5da5"  
1175 - integrity sha512-4kPlzbljFcsttWEq6aBW0OZe6BDajAmyvr2xknBG92tejQnvdGtT9+kXSZ580DqpxY9qG2xeQVF9Dq0ymUTo5Q== 1183 + version "2.0.3"
  1184 + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-2.0.3.tgz#c893b73721db73699943bfc3653b1deb7faa4a3a"
  1185 + integrity sha512-Jus9s4CDbqwocc5pOAnh8ShfrnMcPHuJYzVcSUU7lrh8Ni5HuIqX3oilL86p3dlTrk0LzHRCgA/GQ7uNCw6l2Q==
1176 1186
1177 "@types/minimatch@*": 1187 "@types/minimatch@*":
1178 version "3.0.3" 1188 version "3.0.3"
@@ -1180,9 +1190,14 @@ @@ -1180,9 +1190,14 @@
1180 integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== 1190 integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==
1181 1191
1182 "@types/node@*": 1192 "@types/node@*":
1183 - version "14.0.22"  
1184 - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.0.22.tgz#23ea4d88189cec7d58f9e6b66f786b215eb61bdc"  
1185 - integrity sha512-emeGcJvdiZ4Z3ohbmw93E/64jRzUHAItSHt8nF7M4TGgQTiWqFVGB8KNpLGFmUHmHLvjvBgFwVlqNcq+VuGv9g== 1193 + version "14.0.27"
  1194 + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.0.27.tgz#a151873af5a5e851b51b3b065c9e63390a9e0eb1"
  1195 + integrity sha512-kVrqXhbclHNHGu9ztnAwSncIgJv/FaxmzXJvGXNdcCpV1b8u1/Mi6z6m0vwy0LzKeXFTPLH0NzwmoJ3fNCIq0g==
  1196 +
  1197 +"@types/node@^10.17.15":
  1198 + version "10.17.28"
  1199 + resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.28.tgz#0e36d718a29355ee51cec83b42d921299200f6d9"
  1200 + integrity sha512-dzjES1Egb4c1a89C7lKwQh8pwjYmlOAG9dW1pBgxEk57tMrLnssOfEthz8kdkNaBd7lIqQx7APm5+mZ619IiCQ==
1186 1201
1187 "@types/q@^1.5.1": 1202 "@types/q@^1.5.1":
1188 version "1.5.4" 1203 version "1.5.4"
@@ -1190,9 +1205,9 @@ @@ -1190,9 +1205,9 @@
1190 integrity sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug== 1205 integrity sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==
1191 1206
1192 "@types/qs@*": 1207 "@types/qs@*":
1193 - version "6.9.3"  
1194 - resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.3.tgz#b755a0934564a200d3efdf88546ec93c369abd03"  
1195 - integrity sha512-7s9EQWupR1fTc2pSMtXRQ9w9gLOcrJn+h7HOXw4evxyvVqMi4f+q7d2tnFe3ng3SNHjtK+0EzGMGFUQX4/AQRA== 1208 + version "6.9.4"
  1209 + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.4.tgz#a59e851c1ba16c0513ea123830dd639a0a15cb6a"
  1210 + integrity sha512-+wYo+L6ZF6BMoEjtf8zB2esQsqdV6WsjRK/GP9WOgLPrq87PbNWgIxS76dS5uvl/QXtHGakZmwTznIfcPXcKlQ==
1196 1211
1197 "@types/range-parser@*": 1212 "@types/range-parser@*":
1198 version "1.2.3" 1213 version "1.2.3"
@@ -1200,9 +1215,9 @@ @@ -1200,9 +1215,9 @@
1200 integrity sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA== 1215 integrity sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA==
1201 1216
1202 "@types/serve-static@*": 1217 "@types/serve-static@*":
1203 - version "1.13.4"  
1204 - resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.4.tgz#6662a93583e5a6cabca1b23592eb91e12fa80e7c"  
1205 - integrity sha512-jTDt0o/YbpNwZbQmE/+2e+lfjJEJJR0I3OFaKQKPWkASkCoW3i6fsUnqudSMcNAfbtmADGu8f4MV4q+GqULmug== 1218 + version "1.13.5"
  1219 + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.5.tgz#3d25d941a18415d3ab092def846e135a08bbcf53"
  1220 + integrity sha512-6M64P58N+OXjU432WoLLBQxbA0LRGBCRm7aAGQJ+SMC1IMl0dgRVi9EFfoDcS2a7Xogygk/eGN94CfwU9UF7UQ==
1206 dependencies: 1221 dependencies:
1207 "@types/express-serve-static-core" "*" 1222 "@types/express-serve-static-core" "*"
1208 "@types/mime" "*" 1223 "@types/mime" "*"
@@ -1251,9 +1266,9 @@ @@ -1251,9 +1266,9 @@
1251 "@types/webpack" "*" 1266 "@types/webpack" "*"
1252 1267
1253 "@types/webpack-sources@*": 1268 "@types/webpack-sources@*":
1254 - version "1.4.0"  
1255 - resolved "https://registry.yarnpkg.com/@types/webpack-sources/-/webpack-sources-1.4.0.tgz#e58f1f05f87d39a5c64cf85705bdbdbb94d4d57e"  
1256 - integrity sha512-c88dKrpSle9BtTqR6ifdaxu1Lvjsl3C5OsfvuUbUwdXymshv1TkufUAXBajCCUM/f/TmnkZC/Esb03MinzSiXQ== 1269 + version "1.4.2"
  1270 + resolved "https://registry.yarnpkg.com/@types/webpack-sources/-/webpack-sources-1.4.2.tgz#5d3d4dea04008a779a90135ff96fb5c0c9e6292c"
  1271 + integrity sha512-77T++JyKow4BQB/m9O96n9d/UUHWLQHlcqXb9Vsf4F1+wKNrrlWNFPDLKNT92RJnCSL6CieTc+NDXtCVZswdTw==
1257 dependencies: 1272 dependencies:
1258 "@types/node" "*" 1273 "@types/node" "*"
1259 "@types/source-list-map" "*" 1274 "@types/source-list-map" "*"
@@ -1283,10 +1298,70 @@ @@ -1283,10 +1298,70 @@
1283 "@types/webpack-sources" "*" 1298 "@types/webpack-sources" "*"
1284 source-map "^0.6.0" 1299 source-map "^0.6.0"
1285 1300
  1301 +"@typescript-eslint/eslint-plugin@^3.3.0":
  1302 + version "3.7.1"
  1303 + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-3.7.1.tgz#d144c49a9a0ffe8dd704bb179c243df76c111bc9"
  1304 + integrity sha512-3DB9JDYkMrc8Au00rGFiJLK2Ja9CoMP6Ut0sHsXp3ZtSugjNxvSSHTnKLfo4o+QmjYBJqEznDqsG1zj4F2xnsg==
  1305 + dependencies:
  1306 + "@typescript-eslint/experimental-utils" "3.7.1"
  1307 + debug "^4.1.1"
  1308 + functional-red-black-tree "^1.0.1"
  1309 + regexpp "^3.0.0"
  1310 + semver "^7.3.2"
  1311 + tsutils "^3.17.1"
  1312 +
  1313 +"@typescript-eslint/experimental-utils@3.7.1":
  1314 + version "3.7.1"
  1315 + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-3.7.1.tgz#ab036caaed4c870d22531d41f9352f3147364d61"
  1316 + integrity sha512-TqE97pv7HrqWcGJbLbZt1v59tcqsSVpWTOf1AqrWK7n8nok2sGgVtYRuGXeNeLw3wXlLEbY1MKP3saB2HsO/Ng==
  1317 + dependencies:
  1318 + "@types/json-schema" "^7.0.3"
  1319 + "@typescript-eslint/types" "3.7.1"
  1320 + "@typescript-eslint/typescript-estree" "3.7.1"
  1321 + eslint-scope "^5.0.0"
  1322 + eslint-utils "^2.0.0"
  1323 +
  1324 +"@typescript-eslint/parser@^3.3.0":
  1325 + version "3.7.1"
  1326 + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-3.7.1.tgz#5d9ccecb116d12d9c6073e9861c57c9b1aa88128"
  1327 + integrity sha512-W4QV/gXvfIsccN8225784LNOorcm7ch68Fi3V4Wg7gmkWSQRKevO4RrRqWo6N/Z/myK1QAiGgeaXN57m+R/8iQ==
  1328 + dependencies:
  1329 + "@types/eslint-visitor-keys" "^1.0.0"
  1330 + "@typescript-eslint/experimental-utils" "3.7.1"
  1331 + "@typescript-eslint/types" "3.7.1"
  1332 + "@typescript-eslint/typescript-estree" "3.7.1"
  1333 + eslint-visitor-keys "^1.1.0"
  1334 +
  1335 +"@typescript-eslint/types@3.7.1":
  1336 + version "3.7.1"
  1337 + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-3.7.1.tgz#90375606b2fd73c1224fe9e397ee151e28fa1e0c"
  1338 + integrity sha512-PZe8twm5Z4b61jt7GAQDor6KiMhgPgf4XmUb9zdrwTbgtC/Sj29gXP1dws9yEn4+aJeyXrjsD9XN7AWFhmnUfg==
  1339 +
  1340 +"@typescript-eslint/typescript-estree@3.7.1":
  1341 + version "3.7.1"
  1342 + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-3.7.1.tgz#ce1ffbd0fa53f34d4ce851a7a364e392432f6eb3"
  1343 + integrity sha512-m97vNZkI08dunYOr2lVZOHoyfpqRs0KDpd6qkGaIcLGhQ2WPtgHOd/eVbsJZ0VYCQvupKrObAGTOvk3tfpybYA==
  1344 + dependencies:
  1345 + "@typescript-eslint/types" "3.7.1"
  1346 + "@typescript-eslint/visitor-keys" "3.7.1"
  1347 + debug "^4.1.1"
  1348 + glob "^7.1.6"
  1349 + is-glob "^4.0.1"
  1350 + lodash "^4.17.15"
  1351 + semver "^7.3.2"
  1352 + tsutils "^3.17.1"
  1353 +
  1354 +"@typescript-eslint/visitor-keys@3.7.1":
  1355 + version "3.7.1"
  1356 + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-3.7.1.tgz#b90191e74efdee656be8c5a30f428ed16dda46d1"
  1357 + integrity sha512-xn22sQbEya+Utj2IqJHGLA3i1jDzR43RzWupxojbSWnj3nnPLavaQmWe5utw03CwYao3r00qzXfgJMGNkrzrAA==
  1358 + dependencies:
  1359 + eslint-visitor-keys "^1.1.0"
  1360 +
1286 "@vue/component-compiler-utils@^3.1.0": 1361 "@vue/component-compiler-utils@^3.1.0":
1287 - version "3.1.2"  
1288 - resolved "https://registry.yarnpkg.com/@vue/component-compiler-utils/-/component-compiler-utils-3.1.2.tgz#8213a5ff3202f9f2137fe55370f9e8b9656081c3"  
1289 - integrity sha512-QLq9z8m79mCinpaEeSURhnNCN6djxpHw0lpP/bodMlt5kALfONpryMthvnrQOlTcIKoF+VoPi+lPHUYeDFPXug== 1362 + version "3.2.0"
  1363 + resolved "https://registry.yarnpkg.com/@vue/component-compiler-utils/-/component-compiler-utils-3.2.0.tgz#8f85182ceed28e9b3c75313de669f83166d11e5d"
  1364 + integrity sha512-lejBLa7xAMsfiZfNp7Kv51zOzifnb29FwdnMLa96z26kXErPFioSf9BMcePVIQ6/Gc6/mC0UrPpxAWIHyae0vw==
1290 dependencies: 1365 dependencies:
1291 consolidate "^0.15.1" 1366 consolidate "^0.15.1"
1292 hash-sum "^1.0.2" 1367 hash-sum "^1.0.2"
@@ -1501,9 +1576,9 @@ ajv-errors@^1.0.0: @@ -1501,9 +1576,9 @@ ajv-errors@^1.0.0:
1501 integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== 1576 integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==
1502 1577
1503 ajv-keywords@^3.1.0, ajv-keywords@^3.4.1: 1578 ajv-keywords@^3.1.0, ajv-keywords@^3.4.1:
1504 - version "3.5.1"  
1505 - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.1.tgz#b83ca89c5d42d69031f424cad49aada0236c6957"  
1506 - integrity sha512-KWcq3xN8fDjSB+IMoh2VaXVhRI0BBGxoYp3rx7Pkb6z0cFjYR9Q9l4yZqqals0/zsioCmocC5H6UvsGD4MoIBA== 1579 + version "3.5.2"
  1580 + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d"
  1581 + integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==
1507 1582
1508 ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.2, ajv@^6.5.5: 1583 ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.2, ajv@^6.5.5:
1509 version "6.12.3" 1584 version "6.12.3"
@@ -1820,21 +1895,12 @@ aws4@^1.8.0: @@ -1820,21 +1895,12 @@ aws4@^1.8.0:
1820 resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.10.0.tgz#a17b3a8ea811060e74d47d306122400ad4497ae2" 1895 resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.10.0.tgz#a17b3a8ea811060e74d47d306122400ad4497ae2"
1821 integrity sha512-3YDiu347mtVtjpyV3u5kVqQLP242c06zwDOgpeRnybmXlYYsLbtTrUBUm8i8srONt+FWobl5aibnU1030PeeuA== 1896 integrity sha512-3YDiu347mtVtjpyV3u5kVqQLP242c06zwDOgpeRnybmXlYYsLbtTrUBUm8i8srONt+FWobl5aibnU1030PeeuA==
1822 1897
1823 -axios@0.19.0:  
1824 - version "0.19.0"  
1825 - resolved "https://registry.yarnpkg.com/axios/-/axios-0.19.0.tgz#8e09bff3d9122e133f7b8101c8fbdd00ed3d2ab8"  
1826 - integrity sha512-1uvKqKQta3KBxIz14F2v06AEHZ/dIoeKfbTRkK1E5oqjDnuEerLmYTgJB5AiQZHJcljpg1TuRzdjDR06qNk0DQ==  
1827 - dependencies:  
1828 - follow-redirects "1.5.10"  
1829 - is-buffer "^2.0.2"  
1830 -  
1831 -axios@^0.18.1:  
1832 - version "0.18.1"  
1833 - resolved "https://registry.yarnpkg.com/axios/-/axios-0.18.1.tgz#ff3f0de2e7b5d180e757ad98000f1081b87bcea3"  
1834 - integrity sha512-0BfJq4NSfQXd+SkFdrvFbG7addhYSBA2mQwISr46pD6E5iqkWg02RAs8vyTT/j0RTnoYmeXauBuSv1qKwR179g== 1898 +axios@^0.19.2:
  1899 + version "0.19.2"
  1900 + resolved "https://registry.yarnpkg.com/axios/-/axios-0.19.2.tgz#3ea36c5d8818d0d5f8a8a97a6d36b86cdc00cb27"
  1901 + integrity sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA==
1835 dependencies: 1902 dependencies:
1836 follow-redirects "1.5.10" 1903 follow-redirects "1.5.10"
1837 - is-buffer "^2.0.2"  
1838 1904
1839 babel-eslint@^10.0.1: 1905 babel-eslint@^10.0.1:
1840 version "10.1.0" 1906 version "10.1.0"
@@ -2138,6 +2204,11 @@ buffer-crc32@^0.2.1, buffer-crc32@^0.2.13: @@ -2138,6 +2204,11 @@ buffer-crc32@^0.2.1, buffer-crc32@^0.2.13:
2138 resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" 2204 resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242"
2139 integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI= 2205 integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=
2140 2206
  2207 +buffer-equal-constant-time@1.0.1:
  2208 + version "1.0.1"
  2209 + resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819"
  2210 + integrity sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=
  2211 +
2141 buffer-fill@^1.0.0: 2212 buffer-fill@^1.0.0:
2142 version "1.0.0" 2213 version "1.0.0"
2143 resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c" 2214 resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c"
@@ -2331,9 +2402,9 @@ caniuse-api@^3.0.0: @@ -2331,9 +2402,9 @@ caniuse-api@^3.0.0:
2331 lodash.uniq "^4.5.0" 2402 lodash.uniq "^4.5.0"
2332 2403
2333 caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001061, caniuse-lite@^1.0.30001093: 2404 caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001061, caniuse-lite@^1.0.30001093:
2334 - version "1.0.30001099"  
2335 - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001099.tgz#540118fcc6842d1fde62f4ee5521d1ec6afdb40e"  
2336 - integrity sha512-sdS9A+sQTk7wKoeuZBN/YMAHVztUfVnjDi4/UV3sDE8xoh7YR12hKW+pIdB3oqKGwr9XaFL2ovfzt9w8eUI5CA== 2405 + version "1.0.30001107"
  2406 + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001107.tgz#809360df7a5b3458f627aa46b0f6ed6d5239da9a"
  2407 + integrity sha512-86rCH+G8onCmdN4VZzJet5uPELII59cUzDphko3thQFgAQG1RNa+sVLDoALIhRYmflo5iSIzWY3vu1XTWtNMQQ==
2337 2408
2338 caseless@~0.12.0: 2409 caseless@~0.12.0:
2339 version "0.12.0" 2410 version "0.12.0"
@@ -2381,12 +2452,35 @@ chardet@^0.7.0: @@ -2381,12 +2452,35 @@ chardet@^0.7.0:
2381 resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" 2452 resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e"
2382 integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== 2453 integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==
2383 2454
  2455 +chart.js@^2.9.3:
  2456 + version "2.9.3"
  2457 + resolved "https://registry.yarnpkg.com/chart.js/-/chart.js-2.9.3.tgz#ae3884114dafd381bc600f5b35a189138aac1ef7"
  2458 + integrity sha512-+2jlOobSk52c1VU6fzkh3UwqHMdSlgH1xFv9FKMqHiNCpXsGPQa/+81AFa+i3jZ253Mq9aAycPwDjnn1XbRNNw==
  2459 + dependencies:
  2460 + chartjs-color "^2.1.0"
  2461 + moment "^2.10.2"
  2462 +
  2463 +chartjs-color-string@^0.6.0:
  2464 + version "0.6.0"
  2465 + resolved "https://registry.yarnpkg.com/chartjs-color-string/-/chartjs-color-string-0.6.0.tgz#1df096621c0e70720a64f4135ea171d051402f71"
  2466 + integrity sha512-TIB5OKn1hPJvO7JcteW4WY/63v6KwEdt6udfnDE9iCAZgy+V4SrbSxoIbTw/xkUIapjEI4ExGtD0+6D3KyFd7A==
  2467 + dependencies:
  2468 + color-name "^1.0.0"
  2469 +
  2470 +chartjs-color@^2.1.0:
  2471 + version "2.4.1"
  2472 + resolved "https://registry.yarnpkg.com/chartjs-color/-/chartjs-color-2.4.1.tgz#6118bba202fe1ea79dd7f7c0f9da93467296c3b0"
  2473 + integrity sha512-haqOg1+Yebys/Ts/9bLo/BqUcONQOdr/hoEr2LLTRl6C5LXctUdHxsCYfvQVg5JIxITrfCNUDr4ntqmQk9+/0w==
  2474 + dependencies:
  2475 + chartjs-color-string "^0.6.0"
  2476 + color-convert "^1.9.3"
  2477 +
2384 check-types@^8.0.3: 2478 check-types@^8.0.3:
2385 version "8.0.3" 2479 version "8.0.3"
2386 resolved "https://registry.yarnpkg.com/check-types/-/check-types-8.0.3.tgz#3356cca19c889544f2d7a95ed49ce508a0ecf552" 2480 resolved "https://registry.yarnpkg.com/check-types/-/check-types-8.0.3.tgz#3356cca19c889544f2d7a95ed49ce508a0ecf552"
2387 integrity sha512-YpeKZngUmG65rLudJ4taU7VLkOCTMhNl/u4ctNC56LQS/zJTyNH0Lrtwm1tfTsbLlwvlfsA2d1c8vCf/Kh2KwQ== 2481 integrity sha512-YpeKZngUmG65rLudJ4taU7VLkOCTMhNl/u4ctNC56LQS/zJTyNH0Lrtwm1tfTsbLlwvlfsA2d1c8vCf/Kh2KwQ==
2388 2482
2389 -chokidar@3.4.0, chokidar@^3.4.0: 2483 +chokidar@3.4.0:
2390 version "3.4.0" 2484 version "3.4.0"
2391 resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.0.tgz#b30611423ce376357c765b9b8f904b9fba3c0be8" 2485 resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.0.tgz#b30611423ce376357c765b9b8f904b9fba3c0be8"
2392 integrity sha512-aXAaho2VJtisB/1fg1+3nlLJqGOuewTzQpd/Tz0yTg2R0e4IGtshYvtjowyEumcBv2z+y4+kc75Mz7j5xJskcQ== 2486 integrity sha512-aXAaho2VJtisB/1fg1+3nlLJqGOuewTzQpd/Tz0yTg2R0e4IGtshYvtjowyEumcBv2z+y4+kc75Mz7j5xJskcQ==
@@ -2420,6 +2514,21 @@ chokidar@^2.1.8: @@ -2420,6 +2514,21 @@ chokidar@^2.1.8:
2420 optionalDependencies: 2514 optionalDependencies:
2421 fsevents "^1.2.7" 2515 fsevents "^1.2.7"
2422 2516
  2517 +chokidar@^3.4.1:
  2518 + version "3.4.1"
  2519 + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.1.tgz#e905bdecf10eaa0a0b1db0c664481cc4cbc22ba1"
  2520 + integrity sha512-TQTJyr2stihpC4Sya9hs2Xh+O2wf+igjL36Y75xx2WdHuiICcn/XJza46Jwt0eT5hVpQOzo3FpY3cj3RVYLX0g==
  2521 + dependencies:
  2522 + anymatch "~3.1.1"
  2523 + braces "~3.0.2"
  2524 + glob-parent "~5.1.0"
  2525 + is-binary-path "~2.1.0"
  2526 + is-glob "~4.0.1"
  2527 + normalize-path "~3.0.0"
  2528 + readdirp "~3.4.0"
  2529 + optionalDependencies:
  2530 + fsevents "~2.1.2"
  2531 +
2423 chownr@^1.1.1: 2532 chownr@^1.1.1:
2424 version "1.1.4" 2533 version "1.1.4"
2425 resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" 2534 resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b"
@@ -2545,7 +2654,7 @@ collection-visit@^1.0.0: @@ -2545,7 +2654,7 @@ collection-visit@^1.0.0:
2545 map-visit "^1.0.0" 2654 map-visit "^1.0.0"
2546 object-visit "^1.0.0" 2655 object-visit "^1.0.0"
2547 2656
2548 -color-convert@^1.9.0, color-convert@^1.9.1: 2657 +color-convert@^1.9.0, color-convert@^1.9.1, color-convert@^1.9.3:
2549 version "1.9.3" 2658 version "1.9.3"
2550 resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" 2659 resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
2551 integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== 2660 integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==
@@ -2691,6 +2800,11 @@ config-chain@^1.1.11: @@ -2691,6 +2800,11 @@ config-chain@^1.1.11:
2691 ini "^1.3.4" 2800 ini "^1.3.4"
2692 proto-list "~1.2.1" 2801 proto-list "~1.2.1"
2693 2802
  2803 +confusing-browser-globals@^1.0.9:
  2804 + version "1.0.9"
  2805 + resolved "https://registry.yarnpkg.com/confusing-browser-globals/-/confusing-browser-globals-1.0.9.tgz#72bc13b483c0276801681871d4898516f8f54fdd"
  2806 + integrity sha512-KbS1Y0jMtyPgIxjO7ZzMAuUpAKMt1SzCL9fsrKsX6b0zJPTaT0SiSPmewwVZg9UAO83HVIlEhZF84LIjZ0lmAw==
  2807 +
2694 connect-history-api-fallback@^1.6.0: 2808 connect-history-api-fallback@^1.6.0:
2695 version "1.6.0" 2809 version "1.6.0"
2696 resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz#8b32089359308d111115d81cad3fceab888f97bc" 2810 resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz#8b32089359308d111115d81cad3fceab888f97bc"
@@ -3104,11 +3218,6 @@ dashdash@^1.12.0: @@ -3104,11 +3218,6 @@ dashdash@^1.12.0:
3104 dependencies: 3218 dependencies:
3105 assert-plus "^1.0.0" 3219 assert-plus "^1.0.0"
3106 3220
3107 -date-fns@^2.0.0-beta.4:  
3108 - version "2.14.0"  
3109 - resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.14.0.tgz#359a87a265bb34ef2e38f93ecf63ac453f9bc7ba"  
3110 - integrity sha512-1zD+68jhFgDIM0rF05rcwYO8cExdNqxjq4xP1QKM60Q45mnO6zaMWB4tOzrIr4M4GSLntsKeE4c9Bdl2jhL/yw==  
3111 -  
3112 de-indent@^1.0.2: 3221 de-indent@^1.0.2:
3113 version "1.0.2" 3222 version "1.0.2"
3114 resolved "https://registry.yarnpkg.com/de-indent/-/de-indent-1.0.2.tgz#b2038e846dc33baa5796128d0804b455b8c1e21d" 3223 resolved "https://registry.yarnpkg.com/de-indent/-/de-indent-1.0.2.tgz#b2038e846dc33baa5796128d0804b455b8c1e21d"
@@ -3416,6 +3525,13 @@ ecc-jsbn@~0.1.1: @@ -3416,6 +3525,13 @@ ecc-jsbn@~0.1.1:
3416 jsbn "~0.1.0" 3525 jsbn "~0.1.0"
3417 safer-buffer "^2.1.0" 3526 safer-buffer "^2.1.0"
3418 3527
  3528 +ecdsa-sig-formatter@1.0.11:
  3529 + version "1.0.11"
  3530 + resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz#ae0f0fa2d85045ef14a817daa3ce9acd0489e5bf"
  3531 + integrity sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==
  3532 + dependencies:
  3533 + safe-buffer "^5.0.1"
  3534 +
3419 ee-first@1.1.1: 3535 ee-first@1.1.1:
3420 version "1.1.1" 3536 version "1.1.1"
3421 resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" 3537 resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
@@ -3447,9 +3563,9 @@ electron-osx-sign@^0.4.11: @@ -3447,9 +3563,9 @@ electron-osx-sign@^0.4.11:
3447 plist "^3.0.1" 3563 plist "^3.0.1"
3448 3564
3449 electron-to-chromium@^1.3.488: 3565 electron-to-chromium@^1.3.488:
3450 - version "1.3.496"  
3451 - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.496.tgz#3f43d32930481d82ad3663d79658e7c59a58af0b"  
3452 - integrity sha512-TXY4mwoyowwi4Lsrq9vcTUYBThyc1b2hXaTZI13p8/FRhY2CTaq5lK+DVjhYkKiTLsKt569Xes+0J5JsVXFurQ== 3566 + version "1.3.512"
  3567 + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.512.tgz#620e6731c693ddaaf3750f23dde7f7c4347b7327"
  3568 + integrity sha512-y02hdFg7c4jTfREcXf4fRhHLt7BzofMgd7JAKY+u9i62E0D1eIpLQPFo5/eboZL0bIVY9YHZA53+vCGNFREOXA==
3453 3569
3454 elementtree@0.1.7: 3570 elementtree@0.1.7:
3455 version "0.1.7" 3571 version "0.1.7"
@@ -3499,9 +3615,9 @@ end-of-stream@^1.0.0, end-of-stream@^1.1.0, end-of-stream@^1.4.1: @@ -3499,9 +3615,9 @@ end-of-stream@^1.0.0, end-of-stream@^1.1.0, end-of-stream@^1.4.1:
3499 once "^1.4.0" 3615 once "^1.4.0"
3500 3616
3501 enhanced-resolve@^4.0.0, enhanced-resolve@^4.1.0: 3617 enhanced-resolve@^4.0.0, enhanced-resolve@^4.1.0:
3502 - version "4.2.0"  
3503 - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.2.0.tgz#5d43bda4a0fd447cb0ebbe71bef8deff8805ad0d"  
3504 - integrity sha512-S7eiFb/erugyd1rLb6mQ3Vuq+EXHv5cpCkNqqIkYkBgN2QdFnyCZzFBleqwGEx4lgNGYij81BWnCrFNK7vxvjQ== 3618 + version "4.3.0"
  3619 + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.3.0.tgz#3b806f3bfafc1ec7de69551ef93cca46c1704126"
  3620 + integrity sha512-3e87LvavsdxyoCfGusJnrZ5G8SLPOFeHSNpZI/ATL9a5leXo2k0w6MKnbqhdBad9qTobSfB20Ld7UmgoNbAZkQ==
3505 dependencies: 3621 dependencies:
3506 graceful-fs "^4.1.2" 3622 graceful-fs "^4.1.2"
3507 memory-fs "^0.5.0" 3623 memory-fs "^0.5.0"
@@ -3575,9 +3691,9 @@ es6-error@^4.1.1: @@ -3575,9 +3691,9 @@ es6-error@^4.1.1:
3575 integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg== 3691 integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==
3576 3692
3577 escalade@^3.0.1: 3693 escalade@^3.0.1:
3578 - version "3.0.1"  
3579 - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.0.1.tgz#52568a77443f6927cd0ab9c73129137533c965ed"  
3580 - integrity sha512-DR6NO3h9niOT+MZs7bjxlj2a1k+POu5RN8CLTPX2+i78bRi9eLe7+0zXgUHMnGXWybYcL61E9hGhPKqedy8tQA== 3694 + version "3.0.2"
  3695 + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.0.2.tgz#6a580d70edb87880f22b4c91d0d56078df6962c4"
  3696 + integrity sha512-gPYAU37hYCUhW5euPeR+Y74F7BL+IBsV93j5cvGriSaD1aG6MGsqsV1yamRdrWrb2j3aiZvb0X+UBOWpx3JWtQ==
3581 3697
3582 escape-html@^1.0.1, escape-html@~1.0.3: 3698 escape-html@^1.0.1, escape-html@~1.0.3:
3583 version "1.0.3" 3699 version "1.0.3"
@@ -3594,10 +3710,14 @@ escape-string-regexp@^4.0.0: @@ -3594,10 +3710,14 @@ escape-string-regexp@^4.0.0:
3594 resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" 3710 resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34"
3595 integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== 3711 integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==
3596 3712
3597 -eslint-config-standard@^14.1.0:  
3598 - version "14.1.1"  
3599 - resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-14.1.1.tgz#830a8e44e7aef7de67464979ad06b406026c56ea"  
3600 - integrity sha512-Z9B+VR+JIXRxz21udPTL9HpFMyoMUEeX1G251EQ6e05WD9aPVtVBn09XUmZ259wCMlCDmYDSZG62Hhm+ZTJcUg== 3713 +eslint-config-airbnb-base@^14.0.0:
  3714 + version "14.2.0"
  3715 + resolved "https://registry.yarnpkg.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.2.0.tgz#fe89c24b3f9dc8008c9c0d0d88c28f95ed65e9c4"
  3716 + integrity sha512-Snswd5oC6nJaevs3nZoLSTvGJBvzTfnBqOIArkf3cbyTyq9UD79wOk8s+RiL6bhca0p/eRO6veczhf6A/7Jy8Q==
  3717 + dependencies:
  3718 + confusing-browser-globals "^1.0.9"
  3719 + object.assign "^4.1.0"
  3720 + object.entries "^1.1.2"
3601 3721
3602 eslint-import-resolver-node@^0.3.3: 3722 eslint-import-resolver-node@^0.3.3:
3603 version "0.3.4" 3723 version "0.3.4"
@@ -3626,15 +3746,7 @@ eslint-module-utils@^2.6.0: @@ -3626,15 +3746,7 @@ eslint-module-utils@^2.6.0:
3626 debug "^2.6.9" 3746 debug "^2.6.9"
3627 pkg-dir "^2.0.0" 3747 pkg-dir "^2.0.0"
3628 3748
3629 -eslint-plugin-es@^3.0.0:  
3630 - version "3.0.1"  
3631 - resolved "https://registry.yarnpkg.com/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz#75a7cdfdccddc0589934aeeb384175f221c57893"  
3632 - integrity sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==  
3633 - dependencies:  
3634 - eslint-utils "^2.0.0"  
3635 - regexpp "^3.0.0"  
3636 -  
3637 -eslint-plugin-import@^2.14.0: 3749 +eslint-plugin-import@^2.20.1:
3638 version "2.22.0" 3750 version "2.22.0"
3639 resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.22.0.tgz#92f7736fe1fde3e2de77623c838dd992ff5ffb7e" 3751 resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.22.0.tgz#92f7736fe1fde3e2de77623c838dd992ff5ffb7e"
3640 integrity sha512-66Fpf1Ln6aIS5Gr/55ts19eUuoDhAbZgnr6UxK5hbDx6l/QgQgx61AePq+BV4PP2uXQFClgMVzep5zZ94qqsxg== 3752 integrity sha512-66Fpf1Ln6aIS5Gr/55ts19eUuoDhAbZgnr6UxK5hbDx6l/QgQgx61AePq+BV4PP2uXQFClgMVzep5zZ94qqsxg==
@@ -3653,28 +3765,6 @@ eslint-plugin-import@^2.14.0: @@ -3653,28 +3765,6 @@ eslint-plugin-import@^2.14.0:
3653 resolve "^1.17.0" 3765 resolve "^1.17.0"
3654 tsconfig-paths "^3.9.0" 3766 tsconfig-paths "^3.9.0"
3655 3767
3656 -eslint-plugin-node@^11.0.0:  
3657 - version "11.1.0"  
3658 - resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz#c95544416ee4ada26740a30474eefc5402dc671d"  
3659 - integrity sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==  
3660 - dependencies:  
3661 - eslint-plugin-es "^3.0.0"  
3662 - eslint-utils "^2.0.0"  
3663 - ignore "^5.1.1"  
3664 - minimatch "^3.0.4"  
3665 - resolve "^1.10.1"  
3666 - semver "^6.1.0"  
3667 -  
3668 -eslint-plugin-promise@^4.0.1:  
3669 - version "4.2.1"  
3670 - resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-4.2.1.tgz#845fd8b2260ad8f82564c1222fce44ad71d9418a"  
3671 - integrity sha512-VoM09vT7bfA7D+upt+FjeBO5eHIJQBUWki1aPvB+vbNiHS3+oGIJGIeyBtKQTME6UPXXy3vV07OL1tHd3ANuDw==  
3672 -  
3673 -eslint-plugin-standard@^4.0.0:  
3674 - version "4.0.1"  
3675 - resolved "https://registry.yarnpkg.com/eslint-plugin-standard/-/eslint-plugin-standard-4.0.1.tgz#ff0519f7ffaff114f76d1bd7c3996eef0f6e20b4"  
3676 - integrity sha512-v/KBnfyaOMPmZc/dmc6ozOdWqekGp7bBGq4jLAecEfPGmfKiWS4sA8sC0LqiV9w5qmXAtXVn4M3p1jSyhY85SQ==  
3677 -  
3678 eslint-plugin-vue@^6.1.2: 3768 eslint-plugin-vue@^6.1.2:
3679 version "6.2.2" 3769 version "6.2.2"
3680 resolved "https://registry.yarnpkg.com/eslint-plugin-vue/-/eslint-plugin-vue-6.2.2.tgz#27fecd9a3a24789b0f111ecdd540a9e56198e0fe" 3770 resolved "https://registry.yarnpkg.com/eslint-plugin-vue/-/eslint-plugin-vue-6.2.2.tgz#27fecd9a3a24789b0f111ecdd540a9e56198e0fe"
@@ -3816,9 +3906,9 @@ eventemitter3@^4.0.0: @@ -3816,9 +3906,9 @@ eventemitter3@^4.0.0:
3816 integrity sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ== 3906 integrity sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==
3817 3907
3818 events@^3.0.0: 3908 events@^3.0.0:
3819 - version "3.1.0"  
3820 - resolved "https://registry.yarnpkg.com/events/-/events-3.1.0.tgz#84279af1b34cb75aa88bf5ff291f6d0bd9b31a59"  
3821 - integrity sha512-Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg== 3909 + version "3.2.0"
  3910 + resolved "https://registry.yarnpkg.com/events/-/events-3.2.0.tgz#93b87c18f8efcd4202a461aec4dfc0556b639379"
  3911 + integrity sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg==
3822 3912
3823 eventsource@^1.0.7: 3913 eventsource@^1.0.7:
3824 version "1.0.7" 3914 version "1.0.7"
@@ -4836,7 +4926,7 @@ ignore@^4.0.6: @@ -4836,7 +4926,7 @@ ignore@^4.0.6:
4836 resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" 4926 resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc"
4837 integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== 4927 integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==
4838 4928
4839 -ignore@^5.1.1, ignore@^5.1.4: 4929 +ignore@^5.1.4:
4840 version "5.1.8" 4930 version "5.1.8"
4841 resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57" 4931 resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57"
4842 integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== 4932 integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==
@@ -4959,9 +5049,9 @@ inquirer@7.2.0: @@ -4959,9 +5049,9 @@ inquirer@7.2.0:
4959 through "^2.3.6" 5049 through "^2.3.6"
4960 5050
4961 inquirer@^7.0.0: 5051 inquirer@^7.0.0:
4962 - version "7.3.1"  
4963 - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.3.1.tgz#ac6aba1abdfdd5ad34e7069370411edba17f6439"  
4964 - integrity sha512-/+vOpHQHhoh90Znev8BXiuw1TDQ7IDxWsQnFafUEoK5+4uN5Eoz1p+3GqOj/NtzEi9VzWKQcV9Bm+i8moxedsA== 5052 + version "7.3.3"
  5053 + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.3.3.tgz#04d176b2af04afc157a83fd7c100e98ee0aad003"
  5054 + integrity sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==
4965 dependencies: 5055 dependencies:
4966 ansi-escapes "^4.2.1" 5056 ansi-escapes "^4.2.1"
4967 chalk "^4.1.0" 5057 chalk "^4.1.0"
@@ -4969,7 +5059,7 @@ inquirer@^7.0.0: @@ -4969,7 +5059,7 @@ inquirer@^7.0.0:
4969 cli-width "^3.0.0" 5059 cli-width "^3.0.0"
4970 external-editor "^3.0.3" 5060 external-editor "^3.0.3"
4971 figures "^3.0.0" 5061 figures "^3.0.0"
4972 - lodash "^4.17.16" 5062 + lodash "^4.17.19"
4973 mute-stream "0.0.8" 5063 mute-stream "0.0.8"
4974 run-async "^2.4.0" 5064 run-async "^2.4.0"
4975 rxjs "^6.6.0" 5065 rxjs "^6.6.0"
@@ -5065,11 +5155,6 @@ is-buffer@^1.1.5: @@ -5065,11 +5155,6 @@ is-buffer@^1.1.5:
5065 resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" 5155 resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
5066 integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== 5156 integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==
5067 5157
5068 -is-buffer@^2.0.2:  
5069 - version "2.0.4"  
5070 - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.4.tgz#3e572f23c8411a5cfd9557c849e3665e0b290623"  
5071 - integrity sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==  
5072 -  
5073 is-callable@^1.1.4, is-callable@^1.2.0: 5158 is-callable@^1.1.4, is-callable@^1.2.0:
5074 version "1.2.0" 5159 version "1.2.0"
5075 resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.0.tgz#83336560b54a38e35e3a2df7afd0454d691468bb" 5160 resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.0.tgz#83336560b54a38e35e3a2df7afd0454d691468bb"
@@ -5453,6 +5538,22 @@ jsonfile@^6.0.1: @@ -5453,6 +5538,22 @@ jsonfile@^6.0.1:
5453 optionalDependencies: 5538 optionalDependencies:
5454 graceful-fs "^4.1.6" 5539 graceful-fs "^4.1.6"
5455 5540
  5541 +jsonwebtoken@^8.5.1:
  5542 + version "8.5.1"
  5543 + resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz#00e71e0b8df54c2121a1f26137df2280673bcc0d"
  5544 + integrity sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==
  5545 + dependencies:
  5546 + jws "^3.2.2"
  5547 + lodash.includes "^4.3.0"
  5548 + lodash.isboolean "^3.0.3"
  5549 + lodash.isinteger "^4.0.4"
  5550 + lodash.isnumber "^3.0.3"
  5551 + lodash.isplainobject "^4.0.6"
  5552 + lodash.isstring "^4.0.1"
  5553 + lodash.once "^4.0.0"
  5554 + ms "^2.1.1"
  5555 + semver "^5.6.0"
  5556 +
5456 jsprim@^1.2.2: 5557 jsprim@^1.2.2:
5457 version "1.4.1" 5558 version "1.4.1"
5458 resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" 5559 resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2"
@@ -5463,6 +5564,23 @@ jsprim@^1.2.2: @@ -5463,6 +5564,23 @@ jsprim@^1.2.2:
5463 json-schema "0.2.3" 5564 json-schema "0.2.3"
5464 verror "1.10.0" 5565 verror "1.10.0"
5465 5566
  5567 +jwa@^1.4.1:
  5568 + version "1.4.1"
  5569 + resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.4.1.tgz#743c32985cb9e98655530d53641b66c8645b039a"
  5570 + integrity sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==
  5571 + dependencies:
  5572 + buffer-equal-constant-time "1.0.1"
  5573 + ecdsa-sig-formatter "1.0.11"
  5574 + safe-buffer "^5.0.1"
  5575 +
  5576 +jws@^3.2.2:
  5577 + version "3.2.2"
  5578 + resolved "https://registry.yarnpkg.com/jws/-/jws-3.2.2.tgz#001099f3639468c9414000e99995fa52fb478304"
  5579 + integrity sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==
  5580 + dependencies:
  5581 + jwa "^1.4.1"
  5582 + safe-buffer "^5.0.1"
  5583 +
5466 keyv@^3.0.0: 5584 keyv@^3.0.0:
5467 version "3.1.0" 5585 version "3.1.0"
5468 resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9" 5586 resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9"
@@ -5654,16 +5772,46 @@ lodash.flatten@^4.4.0: @@ -5654,16 +5772,46 @@ lodash.flatten@^4.4.0:
5654 resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" 5772 resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f"
5655 integrity sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8= 5773 integrity sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=
5656 5774
  5775 +lodash.includes@^4.3.0:
  5776 + version "4.3.0"
  5777 + resolved "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f"
  5778 + integrity sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=
  5779 +
  5780 +lodash.isboolean@^3.0.3:
  5781 + version "3.0.3"
  5782 + resolved "https://registry.yarnpkg.com/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz#6c2e171db2a257cd96802fd43b01b20d5f5870f6"
  5783 + integrity sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=
  5784 +
  5785 +lodash.isinteger@^4.0.4:
  5786 + version "4.0.4"
  5787 + resolved "https://registry.yarnpkg.com/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz#619c0af3d03f8b04c31f5882840b77b11cd68343"
  5788 + integrity sha1-YZwK89A/iwTDH1iChAt3sRzWg0M=
  5789 +
  5790 +lodash.isnumber@^3.0.3:
  5791 + version "3.0.3"
  5792 + resolved "https://registry.yarnpkg.com/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz#3ce76810c5928d03352301ac287317f11c0b1ffc"
  5793 + integrity sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w=
  5794 +
5657 lodash.isplainobject@^4.0.6: 5795 lodash.isplainobject@^4.0.6:
5658 version "4.0.6" 5796 version "4.0.6"
5659 resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" 5797 resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb"
5660 integrity sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs= 5798 integrity sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=
5661 5799
  5800 +lodash.isstring@^4.0.1:
  5801 + version "4.0.1"
  5802 + resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451"
  5803 + integrity sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=
  5804 +
5662 lodash.memoize@^4.1.2: 5805 lodash.memoize@^4.1.2:
5663 version "4.1.2" 5806 version "4.1.2"
5664 resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" 5807 resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe"
5665 integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= 5808 integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=
5666 5809
  5810 +lodash.once@^4.0.0:
  5811 + version "4.1.1"
  5812 + resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac"
  5813 + integrity sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=
  5814 +
5667 lodash.template@4.5.0, lodash.template@^4.5.0: 5815 lodash.template@4.5.0, lodash.template@^4.5.0:
5668 version "4.5.0" 5816 version "4.5.0"
5669 resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.5.0.tgz#f976195cf3f347d0d5f52483569fe8031ccce8ab" 5817 resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.5.0.tgz#f976195cf3f347d0d5f52483569fe8031ccce8ab"
@@ -5694,7 +5842,7 @@ lodash.uniq@^4.5.0: @@ -5694,7 +5842,7 @@ lodash.uniq@^4.5.0:
5694 resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" 5842 resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773"
5695 integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= 5843 integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=
5696 5844
5697 -lodash@^4.0.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.16, lodash@^4.17.5, lodash@~4.17.10: 5845 +lodash@^4.0.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.5, lodash@~4.17.10:
5698 version "4.17.19" 5846 version "4.17.19"
5699 resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.19.tgz#e48ddedbe30b3321783c5b4301fbd353bc1e4a4b" 5847 resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.19.tgz#e48ddedbe30b3321783c5b4301fbd353bc1e4a4b"
5700 integrity sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ== 5848 integrity sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==
@@ -6014,9 +6162,9 @@ minipass-flush@^1.0.5: @@ -6014,9 +6162,9 @@ minipass-flush@^1.0.5:
6014 minipass "^3.0.0" 6162 minipass "^3.0.0"
6015 6163
6016 minipass-pipeline@^1.2.2: 6164 minipass-pipeline@^1.2.2:
6017 - version "1.2.3"  
6018 - resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.3.tgz#55f7839307d74859d6e8ada9c3ebe72cec216a34"  
6019 - integrity sha512-cFOknTvng5vqnwOpDsZTWhNll6Jf8o2x+/diplafmxpuIymAjzoOolZG0VvQf3V2HgqzJNhnuKHYp2BqDgz8IQ== 6165 + version "1.2.4"
  6166 + resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz#68472f79711c084657c067c5c6ad93cddea8214c"
  6167 + integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==
6020 dependencies: 6168 dependencies:
6021 minipass "^3.0.0" 6169 minipass "^3.0.0"
6022 6170
@@ -6059,7 +6207,7 @@ mixin-deep@^1.2.0: @@ -6059,7 +6207,7 @@ mixin-deep@^1.2.0:
6059 for-in "^1.0.2" 6207 for-in "^1.0.2"
6060 is-extendable "^1.0.1" 6208 is-extendable "^1.0.1"
6061 6209
6062 -"mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@~0.5.1, mkdirp@~0.5.x: 6210 +"mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.5, mkdirp@~0.5.1, mkdirp@~0.5.x:
6063 version "0.5.5" 6211 version "0.5.5"
6064 resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" 6212 resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def"
6065 integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== 6213 integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==
@@ -6071,7 +6219,7 @@ mkdirp@^1.0.3, mkdirp@^1.0.4: @@ -6071,7 +6219,7 @@ mkdirp@^1.0.3, mkdirp@^1.0.4:
6071 resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" 6219 resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e"
6072 integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== 6220 integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==
6073 6221
6074 -moment@^2.22.1: 6222 +moment@^2.10.2, moment@^2.22.1:
6075 version "2.27.0" 6223 version "2.27.0"
6076 resolved "https://registry.yarnpkg.com/moment/-/moment-2.27.0.tgz#8bff4e3e26a236220dfe3e36de756b6ebaa0105d" 6224 resolved "https://registry.yarnpkg.com/moment/-/moment-2.27.0.tgz#8bff4e3e26a236220dfe3e36de756b6ebaa0105d"
6077 integrity sha512-al0MUK7cpIcglMv3YF13qSgdAIqxHTO7brRtaz3DlSULbqfazqkc5kEjNrLDOM7fsjshoFIihnU8snrP7zUvhQ== 6225 integrity sha512-al0MUK7cpIcglMv3YF13qSgdAIqxHTO7brRtaz3DlSULbqfazqkc5kEjNrLDOM7fsjshoFIihnU8snrP7zUvhQ==
@@ -6236,9 +6384,9 @@ node-loader@0.6.0: @@ -6236,9 +6384,9 @@ node-loader@0.6.0:
6236 integrity sha1-x5fvUQle1YWZArFX9jhPY2HgWug= 6384 integrity sha1-x5fvUQle1YWZArFX9jhPY2HgWug=
6237 6385
6238 node-releases@^1.1.58: 6386 node-releases@^1.1.58:
6239 - version "1.1.59"  
6240 - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.59.tgz#4d648330641cec704bff10f8e4fe28e453ab8e8e"  
6241 - integrity sha512-H3JrdUczbdiwxN5FuJPyCHnGHIFqQ0wWxo+9j1kAXAzqNMAHlo+4I/sYYxpyK0irQ73HgdiyzD32oqQDcU2Osw== 6387 + version "1.1.60"
  6388 + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.60.tgz#6948bdfce8286f0b5d0e5a88e8384e954dfe7084"
  6389 + integrity sha512-gsO4vjEdQaTusZAEebUWp2a5d7dF5DYoIpDG7WySnk7BuZDW+GPpHXoXXuYawRBr/9t5q54tirPz79kFIWg4dA==
6242 6390
6243 node-sass@4.14.1: 6391 node-sass@4.14.1:
6244 version "4.14.1" 6392 version "4.14.1"
@@ -6418,6 +6566,15 @@ object.assign@^4.1.0: @@ -6418,6 +6566,15 @@ object.assign@^4.1.0:
6418 has-symbols "^1.0.0" 6566 has-symbols "^1.0.0"
6419 object-keys "^1.0.11" 6567 object-keys "^1.0.11"
6420 6568
  6569 +object.entries@^1.1.2:
  6570 + version "1.1.2"
  6571 + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.2.tgz#bc73f00acb6b6bb16c203434b10f9a7e797d3add"
  6572 + integrity sha512-BQdB9qKmb/HyNdMNWVr7O3+z5MUIx3aiegEIJqjMBbBf0YT9RRxTJSim4mzFqtyr7PDAHigq0N9dO0m0tRakQA==
  6573 + dependencies:
  6574 + define-properties "^1.1.3"
  6575 + es-abstract "^1.17.5"
  6576 + has "^1.0.3"
  6577 +
6421 object.getownpropertydescriptors@^2.0.3, object.getownpropertydescriptors@^2.1.0: 6578 object.getownpropertydescriptors@^2.0.3, object.getownpropertydescriptors@^2.1.0:
6422 version "2.1.0" 6579 version "2.1.0"
6423 resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz#369bf1f9592d8ab89d712dced5cb81c7c5352649" 6580 resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz#369bf1f9592d8ab89d712dced5cb81c7c5352649"
@@ -6887,13 +7044,13 @@ plist@^3.0.1: @@ -6887,13 +7044,13 @@ plist@^3.0.1:
6887 xmldom "0.1.x" 7044 xmldom "0.1.x"
6888 7045
6889 portfinder@^1.0.26: 7046 portfinder@^1.0.26:
6890 - version "1.0.26"  
6891 - resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.26.tgz#475658d56ca30bed72ac7f1378ed350bd1b64e70"  
6892 - integrity sha512-Xi7mKxJHHMI3rIUrnm/jjUgwhbYMkp/XKEcZX3aG4BrumLpq3nmoQMX+ClYnDZnZ/New7IatC1no5RX0zo1vXQ== 7047 + version "1.0.28"
  7048 + resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.28.tgz#67c4622852bd5374dd1dd900f779f53462fac778"
  7049 + integrity sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==
6893 dependencies: 7050 dependencies:
6894 async "^2.6.2" 7051 async "^2.6.2"
6895 debug "^3.1.1" 7052 debug "^3.1.1"
6896 - mkdirp "^0.5.1" 7053 + mkdirp "^0.5.5"
6897 7054
6898 posix-character-classes@^0.1.0: 7055 posix-character-classes@^0.1.0:
6899 version "0.1.1" 7056 version "0.1.1"
@@ -7044,14 +7201,14 @@ postcss-modules-extract-imports@^2.0.0: @@ -7044,14 +7201,14 @@ postcss-modules-extract-imports@^2.0.0:
7044 postcss "^7.0.5" 7201 postcss "^7.0.5"
7045 7202
7046 postcss-modules-local-by-default@^3.0.2: 7203 postcss-modules-local-by-default@^3.0.2:
7047 - version "3.0.2"  
7048 - resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.2.tgz#e8a6561be914aaf3c052876377524ca90dbb7915"  
7049 - integrity sha512-jM/V8eqM4oJ/22j0gx4jrp63GSvDH6v86OqyTHHUvk4/k1vceipZsaymiZ5PvocqZOl5SFHiFJqjs3la0wnfIQ== 7204 + version "3.0.3"
  7205 + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.3.tgz#bb14e0cc78279d504dbdcbfd7e0ca28993ffbbb0"
  7206 + integrity sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw==
7050 dependencies: 7207 dependencies:
7051 icss-utils "^4.1.1" 7208 icss-utils "^4.1.1"
7052 - postcss "^7.0.16" 7209 + postcss "^7.0.32"
7053 postcss-selector-parser "^6.0.2" 7210 postcss-selector-parser "^6.0.2"
7054 - postcss-value-parser "^4.0.0" 7211 + postcss-value-parser "^4.1.0"
7055 7212
7056 postcss-modules-scope@^2.2.0: 7213 postcss-modules-scope@^2.2.0:
7057 version "2.2.0" 7214 version "2.2.0"
@@ -7235,7 +7392,7 @@ postcss-value-parser@^3.0.0: @@ -7235,7 +7392,7 @@ postcss-value-parser@^3.0.0:
7235 resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" 7392 resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281"
7236 integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== 7393 integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==
7237 7394
7238 -postcss-value-parser@^4.0.0, postcss-value-parser@^4.0.2, postcss-value-parser@^4.1.0: 7395 +postcss-value-parser@^4.0.2, postcss-value-parser@^4.1.0:
7239 version "4.1.0" 7396 version "4.1.0"
7240 resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz#443f6a20ced6481a2bda4fa8532a6e55d789a2cb" 7397 resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz#443f6a20ced6481a2bda4fa8532a6e55d789a2cb"
7241 integrity sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ== 7398 integrity sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==
@@ -7249,7 +7406,7 @@ postcss@^6.0.23: @@ -7249,7 +7406,7 @@ postcss@^6.0.23:
7249 source-map "^0.6.1" 7406 source-map "^0.6.1"
7250 supports-color "^5.4.0" 7407 supports-color "^5.4.0"
7251 7408
7252 -postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.16, postcss@^7.0.26, postcss@^7.0.27, postcss@^7.0.30, postcss@^7.0.32, postcss@^7.0.5, postcss@^7.0.6: 7409 +postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.26, postcss@^7.0.27, postcss@^7.0.30, postcss@^7.0.32, postcss@^7.0.5, postcss@^7.0.6:
7253 version "7.0.32" 7410 version "7.0.32"
7254 resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.32.tgz#4310d6ee347053da3433db2be492883d62cec59d" 7411 resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.32.tgz#4310d6ee347053da3433db2be492883d62cec59d"
7255 integrity sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw== 7412 integrity sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==
@@ -7402,9 +7559,9 @@ qs@~6.5.2: @@ -7402,9 +7559,9 @@ qs@~6.5.2:
7402 integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== 7559 integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==
7403 7560
7404 quasar@^1.0.0: 7561 quasar@^1.0.0:
7405 - version "1.12.10"  
7406 - resolved "https://registry.yarnpkg.com/quasar/-/quasar-1.12.10.tgz#45daa4bfd14d66b67bb2da8413d0ae09a32af518"  
7407 - integrity sha512-O8BQeRIfA/oun5YwUV7aMeKhqfmGy38EqTf4lWxPXhVo3Bs4ZN4r6DeR2X8OQHqr76fblQWxU48uPIZgB68VBg== 7562 + version "1.12.13"
  7563 + resolved "https://registry.yarnpkg.com/quasar/-/quasar-1.12.13.tgz#236331b55a5403e42db5202ef8e66629aef4adf5"
  7564 + integrity sha512-e5cU3cxwZEc+MIJ6/a5IyV5HJ4B1WJscpEqDi+1BpIfVu4/9/WS9a0dnki5jVEvcsbuV4G133XCHQ09fdXoL1A==
7408 7565
7409 query-string@^4.1.0: 7566 query-string@^4.1.0:
7410 version "4.3.4" 7567 version "4.3.4"
@@ -7552,9 +7709,9 @@ regenerate@^1.4.0: @@ -7552,9 +7709,9 @@ regenerate@^1.4.0:
7552 integrity sha512-j2+C8+NtXQgEKWk49MMP5P/u2GhnahTtVkRIHr5R5lVRlbKvmQ+oS+A5aLKWp2ma5VkT8sh6v+v4hbH0YHR66A== 7709 integrity sha512-j2+C8+NtXQgEKWk49MMP5P/u2GhnahTtVkRIHr5R5lVRlbKvmQ+oS+A5aLKWp2ma5VkT8sh6v+v4hbH0YHR66A==
7553 7710
7554 regenerator-runtime@^0.13.4: 7711 regenerator-runtime@^0.13.4:
7555 - version "0.13.5"  
7556 - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz#d878a1d094b4306d10b9096484b33ebd55e26697"  
7557 - integrity sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA== 7712 + version "0.13.7"
  7713 + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz#cac2dacc8a1ea675feaabaeb8ae833898ae46f55"
  7714 + integrity sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==
7558 7715
7559 regenerator-transform@^0.14.2: 7716 regenerator-transform@^0.14.2:
7560 version "0.14.5" 7717 version "0.14.5"
@@ -7724,7 +7881,7 @@ resolve-url@^0.2.1: @@ -7724,7 +7881,7 @@ resolve-url@^0.2.1:
7724 resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" 7881 resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a"
7725 integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= 7882 integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=
7726 7883
7727 -resolve@^1.10.0, resolve@^1.10.1, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.17.0, resolve@^1.2.0, resolve@^1.3.2, resolve@^1.8.1: 7884 +resolve@^1.10.0, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.17.0, resolve@^1.2.0, resolve@^1.3.2, resolve@^1.8.1:
7728 version "1.17.0" 7885 version "1.17.0"
7729 resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" 7886 resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444"
7730 integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== 7887 integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==
@@ -7965,7 +8122,7 @@ semver@7.3.2, semver@^7.3.2: @@ -7965,7 +8122,7 @@ semver@7.3.2, semver@^7.3.2:
7965 resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938" 8122 resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938"
7966 integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== 8123 integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==
7967 8124
7968 -semver@^6.0.0, semver@^6.1.0, semver@^6.1.2, semver@^6.3.0: 8125 +semver@^6.0.0, semver@^6.1.2, semver@^6.3.0:
7969 version "6.3.0" 8126 version "6.3.0"
7970 resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" 8127 resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
7971 integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== 8128 integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
@@ -8872,11 +9029,18 @@ tsconfig-paths@^3.9.0: @@ -8872,11 +9029,18 @@ tsconfig-paths@^3.9.0:
8872 minimist "^1.2.0" 9029 minimist "^1.2.0"
8873 strip-bom "^3.0.0" 9030 strip-bom "^3.0.0"
8874 9031
8875 -tslib@^1.10.0, tslib@^1.9.0: 9032 +tslib@^1.10.0, tslib@^1.8.1, tslib@^1.9.0:
8876 version "1.13.0" 9033 version "1.13.0"
8877 resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.13.0.tgz#c881e13cc7015894ed914862d276436fa9a47043" 9034 resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.13.0.tgz#c881e13cc7015894ed914862d276436fa9a47043"
8878 integrity sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q== 9035 integrity sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==
8879 9036
  9037 +tsutils@^3.17.1:
  9038 + version "3.17.1"
  9039 + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.17.1.tgz#ed719917f11ca0dee586272b2ac49e015a2dd759"
  9040 + integrity sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==
  9041 + dependencies:
  9042 + tslib "^1.8.1"
  9043 +
8880 tty-browserify@0.0.0: 9044 tty-browserify@0.0.0:
8881 version "0.0.0" 9045 version "0.0.0"
8882 resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" 9046 resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6"
@@ -9158,11 +9322,6 @@ validate-npm-package-license@^3.0.1: @@ -9158,11 +9322,6 @@ validate-npm-package-license@^3.0.1:
9158 spdx-correct "^3.0.0" 9322 spdx-correct "^3.0.0"
9159 spdx-expression-parse "^3.0.0" 9323 spdx-expression-parse "^3.0.0"
9160 9324
9161 -validator@^10.9.0:  
9162 - version "10.11.0"  
9163 - resolved "https://registry.yarnpkg.com/validator/-/validator-10.11.0.tgz#003108ea6e9a9874d31ccc9e5006856ccd76b228"  
9164 - integrity sha512-X/p3UZerAIsbBfN/IwahhYaBbY68EN/UQBWHtsbXGT5bfrH/p4NQzUCG1kF/rtKaNpnJ7jAu6NGTdSNtyNIXMw==  
9165 -  
9166 vary@~1.1.2: 9325 vary@~1.1.2:
9167 version "1.1.2" 9326 version "1.1.2"
9168 resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" 9327 resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
@@ -9187,6 +9346,16 @@ vm-browserify@^1.0.1: @@ -9187,6 +9346,16 @@ vm-browserify@^1.0.1:
9187 resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" 9346 resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0"
9188 integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== 9347 integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==
9189 9348
  9349 +vue-chartjs@^3.5.0:
  9350 + version "3.5.0"
  9351 + resolved "https://registry.yarnpkg.com/vue-chartjs/-/vue-chartjs-3.5.0.tgz#edd0c2be94c521bcbc5357c24afb9f3560855f84"
  9352 + integrity sha512-yWNhG3B6g6lvYqNInP0WaDWNZG/SNb6XnltkjR0wYC5pmLm6jvdiotj8er7Mui8qkJGfLZe6ULjrZdHWjegAUg==
  9353 +
  9354 +vue-class-component@^7.1.0, vue-class-component@^7.2.2:
  9355 + version "7.2.5"
  9356 + resolved "https://registry.yarnpkg.com/vue-class-component/-/vue-class-component-7.2.5.tgz#212b3548c4fdd3314774c4adbc1c3792a40b52d0"
  9357 + integrity sha512-0CSftHY0bDTD+4FbYkuFf6+iKDjZ4h2in2YYJDRMk5daZIjrgT9LjFHvP7Rzqy9/s1pij3zDtTSLRUjsPWMwqg==
  9358 +
9190 vue-eslint-parser@^7.0.0: 9359 vue-eslint-parser@^7.0.0:
9191 version "7.1.0" 9360 version "7.1.0"
9192 resolved "https://registry.yarnpkg.com/vue-eslint-parser/-/vue-eslint-parser-7.1.0.tgz#9cdbcc823e656b087507a1911732b867ac101e83" 9361 resolved "https://registry.yarnpkg.com/vue-eslint-parser/-/vue-eslint-parser-7.1.0.tgz#9cdbcc823e656b087507a1911732b867ac101e83"
@@ -9215,16 +9384,12 @@ vue-loader@15.9.2: @@ -9215,16 +9384,12 @@ vue-loader@15.9.2:
9215 vue-hot-reload-api "^2.3.0" 9384 vue-hot-reload-api "^2.3.0"
9216 vue-style-loader "^4.1.0" 9385 vue-style-loader "^4.1.0"
9217 9386
9218 -vue-mc@^0.6.0:  
9219 - version "0.6.0"  
9220 - resolved "https://registry.yarnpkg.com/vue-mc/-/vue-mc-0.6.0.tgz#cb5383e33b335f6109ff63451242b1e57cabc0af"  
9221 - integrity sha512-URLyySD1qpa1uPtlOe8eBZIfk6gnKSC53JtP46gbNxbsQ+xcR5H1wohsxn5KrGVxKCMX2mqIElimLoixdahETw== 9387 +vue-property-decorator@^8.3.0:
  9388 + version "8.5.1"
  9389 + resolved "https://registry.yarnpkg.com/vue-property-decorator/-/vue-property-decorator-8.5.1.tgz#571a91cf8d2b507f537d79bf8275af3184572fff"
  9390 + integrity sha512-O6OUN2OMsYTGPvgFtXeBU3jPnX5ffQ9V4I1WfxFQ6dqz6cOUbR3Usou7kgFpfiXDvV7dJQSFcJ5yUPgOtPPm1Q==
9222 dependencies: 9391 dependencies:
9223 - axios "0.19.0"  
9224 - date-fns "^2.0.0-beta.4"  
9225 - lodash "^4.17.11"  
9226 - validator "^10.9.0"  
9227 - vue "^2.5.17" 9392 + vue-class-component "^7.1.0"
9228 9393
9229 vue-router@3.2.0: 9394 vue-router@3.2.0:
9230 version "3.2.0" 9395 version "3.2.0"
@@ -9266,7 +9431,7 @@ vue-template-es2015-compiler@^1.9.0: @@ -9266,7 +9431,7 @@ vue-template-es2015-compiler@^1.9.0:
9266 resolved "https://registry.yarnpkg.com/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.9.1.tgz#1ee3bc9a16ecbf5118be334bb15f9c46f82f5825" 9431 resolved "https://registry.yarnpkg.com/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.9.1.tgz#1ee3bc9a16ecbf5118be334bb15f9c46f82f5825"
9267 integrity sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw== 9432 integrity sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw==
9268 9433
9269 -vue@2.6.11, vue@^2.5.17: 9434 +vue@2.6.11:
9270 version "2.6.11" 9435 version "2.6.11"
9271 resolved "https://registry.yarnpkg.com/vue/-/vue-2.6.11.tgz#76594d877d4b12234406e84e35275c6d514125c5" 9436 resolved "https://registry.yarnpkg.com/vue/-/vue-2.6.11.tgz#76594d877d4b12234406e84e35275c6d514125c5"
9272 integrity sha512-VfPwgcGABbGAue9+sfrD4PuwFar7gPb1yl1UK1MwXoQPAw0BKSqWfoYCT/ThFrdEVWoI51dBuyCoiNU9bZDZxQ== 9437 integrity sha512-VfPwgcGABbGAue9+sfrD4PuwFar7gPb1yl1UK1MwXoQPAw0BKSqWfoYCT/ThFrdEVWoI51dBuyCoiNU9bZDZxQ==
@@ -9284,14 +9449,14 @@ watchpack-chokidar2@^2.0.0: @@ -9284,14 +9449,14 @@ watchpack-chokidar2@^2.0.0:
9284 chokidar "^2.1.8" 9449 chokidar "^2.1.8"
9285 9450
9286 watchpack@^1.6.1: 9451 watchpack@^1.6.1:
9287 - version "1.7.2"  
9288 - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.7.2.tgz#c02e4d4d49913c3e7e122c3325365af9d331e9aa"  
9289 - integrity sha512-ymVbbQP40MFTp+cNMvpyBpBtygHnPzPkHqoIwRRj/0B8KhqQwV8LaKjtbaxF2lK4vl8zN9wCxS46IFCU5K4W0g== 9452 + version "1.7.4"
  9453 + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.7.4.tgz#6e9da53b3c80bb2d6508188f5b200410866cd30b"
  9454 + integrity sha512-aWAgTW4MoSJzZPAicljkO1hsi1oKj/RRq/OJQh2PKI2UKL04c2Bs+MBOB+BBABHTXJpf9mCwHN7ANCvYsvY2sg==
9290 dependencies: 9455 dependencies:
9291 graceful-fs "^4.1.2" 9456 graceful-fs "^4.1.2"
9292 neo-async "^2.5.0" 9457 neo-async "^2.5.0"
9293 optionalDependencies: 9458 optionalDependencies:
9294 - chokidar "^3.4.0" 9459 + chokidar "^3.4.1"
9295 watchpack-chokidar2 "^2.0.0" 9460 watchpack-chokidar2 "^2.0.0"
9296 9461
9297 wbuf@^1.1.0, wbuf@^1.7.3: 9462 wbuf@^1.1.0, wbuf@^1.7.3: