generator-jhipster 7.9.0 → 7.9.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (227) hide show
  1. package/cli/environment-builder.js +15 -1
  2. package/cli/jhipster.js +0 -0
  3. package/generators/app/index.js +12 -1
  4. package/generators/bootstrap/index.js +33 -1
  5. package/generators/ci-cd/templates/circle.yml.ejs +3 -13
  6. package/generators/client/files-angular.js +1 -1
  7. package/generators/client/files-react.js +5 -2
  8. package/generators/client/files-vue.js +3 -2
  9. package/generators/client/templates/angular/jest.conf.js.ejs +6 -3
  10. package/generators/client/templates/angular/package.json +18 -18
  11. package/generators/client/templates/angular/package.json.ejs +3 -7
  12. package/generators/client/templates/angular/src/main/webapp/app/admin/admin-routing.module.ts.ejs +1 -1
  13. package/generators/client/templates/angular/src/main/webapp/app/admin/health/health.model.ts.ejs +1 -1
  14. package/generators/client/templates/angular/src/main/webapp/app/admin/user-management/update/user-management-update.component.ts.ejs +17 -15
  15. package/generators/client/templates/angular/src/main/webapp/app/admin/user-management/user-management.model.ts.ejs +2 -2
  16. package/generators/client/templates/angular/src/main/webapp/app/admin/user-management/user-management.route.ts.ejs +4 -4
  17. package/generators/client/templates/angular/src/main/webapp/app/core/request/request-util.ts.ejs +4 -2
  18. package/generators/client/templates/angular/src/main/webapp/app/core/util/data-util.service.ts.ejs +1 -1
  19. package/generators/client/templates/angular/src/main/webapp/app/core/util/parse-links.service.ts.ejs +1 -1
  20. package/generators/client/templates/angular/src/main/webapp/app/layouts/navbar/navbar.component.html.ejs +1 -1
  21. package/generators/client/templates/angular/src/main/webapp/app/shared/filter/filter.component.html.ejs +8 -6
  22. package/generators/client/templates/angular/src/main/webapp/app/shared/filter/filter.component.ts.ejs +6 -11
  23. package/generators/client/templates/angular/src/main/webapp/app/shared/filter/filter.model.spec.ts.ejs +227 -25
  24. package/generators/client/templates/angular/src/main/webapp/app/shared/filter/filter.model.ts.ejs +104 -43
  25. package/generators/client/templates/angular/src/main/webapp/content/scss/global.scss.ejs +8 -0
  26. package/generators/client/templates/angular/tsconfig.json.ejs +0 -1
  27. package/generators/client/templates/angular/tsconfig.spec.json.ejs +2 -3
  28. package/generators/client/templates/angular/webpack/webpack.microfrontend.js.ejs +0 -3
  29. package/generators/client/templates/common/package.json +4 -4
  30. package/generators/client/templates/common/src/main/webapp/swagger-ui/index.html.ejs +1 -1
  31. package/generators/client/templates/react/jest.conf.js.ejs +2 -2
  32. package/generators/client/templates/react/package.json +24 -24
  33. package/generators/client/templates/react/package.json.ejs +3 -7
  34. package/generators/client/templates/react/src/main/webapp/app/config/store.ts.ejs +0 -6
  35. package/generators/client/templates/react/src/main/webapp/app/index.tsx.ejs +4 -5
  36. package/generators/client/templates/react/src/main/webapp/app/modules/administration/administration.reducer.spec.ts.ejs +7 -7
  37. package/generators/client/templates/react/src/main/webapp/app/modules/administration/administration.reducer.ts.ejs +6 -6
  38. package/generators/client/templates/react/src/main/webapp/app/modules/administration/index.tsx.ejs +2 -2
  39. package/generators/client/templates/react/src/main/webapp/app/shared/layout/menus/admin.tsx.ejs +1 -1
  40. package/generators/client/templates/react/src/main/webapp/app/shared/reducers/authentication.spec.ts.ejs +17 -8
  41. package/generators/client/templates/react/src/main/webapp/app/shared/reducers/authentication.ts.ejs +1 -1
  42. package/generators/client/templates/react/src/main/webapp/app/shared/reducers/locale.spec.ts.ejs +176 -19
  43. package/generators/client/templates/react/src/main/webapp/app/shared/reducers/locale.ts.ejs +46 -13
  44. package/generators/client/templates/react/webpack/webpack.microfrontend.js.jhi.react.ejs +1 -1
  45. package/generators/client/templates/vue/package.json +17 -17
  46. package/generators/client/templates/vue/package.json.ejs +3 -7
  47. package/generators/client/templates/vue/src/main/webapp/app/core/jhi-navbar/jhi-navbar.component.ts.ejs +2 -1
  48. package/generators/client/templates/vue/src/main/webapp/app/core/jhi-navbar/jhi-navbar.vue.ejs +1 -1
  49. package/generators/client/templates/vue/src/main/webapp/app/main.ts.ejs +2 -2
  50. package/generators/client/templates/vue/src/main/webapp/app/router/admin.ts.ejs +2 -2
  51. package/generators/client/templates/vue/src/test/javascript/e2e/modules/administration/administration.spec.ts.ejs +1 -1
  52. package/generators/client/templates/vue/src/test/javascript/e2e/page-objects/administration-page.ts.ejs +1 -1
  53. package/generators/client/templates/vue/src/test/javascript/e2e/page-objects/navbar-page.ts.ejs +2 -2
  54. package/generators/client/templates/vue/src/test/javascript/jest.conf.js.ejs +5 -6
  55. package/generators/client/templates/vue/src/test/javascript/spec/app/account/account.service.spec.ts.ejs +4 -0
  56. package/generators/client/templates/vue/src/test/javascript/spec/app/shared/alert/alert.service.spec.ts.ejs +106 -3
  57. package/generators/client/templates/vue/src/test/javascript/spec/app/shared/config/axios-interceptor.spec.ts.ejs +12 -0
  58. package/generators/client/templates/vue/src/test/javascript/spec/app/shared/config/formatter.spec.ts.ejs +6 -0
  59. package/generators/client/templates/vue/src/test/javascript/spec/app/shared/sort/sorts.spec.ts.ejs +10 -0
  60. package/generators/client/templates/vue/webpack/webpack.common.js.ejs +1 -1
  61. package/generators/client/templates/vue/webpack/webpack.dev.js.ejs +2 -2
  62. package/generators/common/files.js +5 -4
  63. package/generators/common/templates/.husky/pre-commit.ejs +0 -0
  64. package/generators/common/templates/package.json +1 -1
  65. package/generators/common/templates/sonar-project.properties.ejs +19 -11
  66. package/generators/cypress/index.js +1 -1
  67. package/generators/docker-compose/templates/README-DOCKER-COMPOSE.md.ejs +3 -3
  68. package/generators/docker-compose/templates/docker-compose.yml.ejs +1 -1
  69. package/generators/docker-compose/templates/realm-config/jhipster-realm.json.ejs +32 -14
  70. package/generators/entity/index.js +4 -3
  71. package/generators/entity-client/templates/angular/src/main/webapp/app/entities/detail/entity-management-detail.component.html.ejs +1 -1
  72. package/generators/entity-client/templates/angular/src/main/webapp/app/entities/list/entity-management.component.html.ejs +18 -6
  73. package/generators/entity-client/templates/angular/src/main/webapp/app/entities/list/entity-management.component.spec.ts.ejs +1 -1
  74. package/generators/entity-client/templates/angular/src/main/webapp/app/entities/list/entity-management.component.ts.ejs +23 -19
  75. package/generators/entity-client/templates/angular/src/main/webapp/app/entities/service/entity.service.spec.ts.ejs +3 -1
  76. package/generators/entity-client/templates/angular/src/main/webapp/app/entities/service/entity.service.ts.ejs +1 -1
  77. package/generators/entity-client/templates/angular/src/main/webapp/app/entities/update/entity-form.service.ts.ejs +1 -1
  78. package/generators/entity-client/templates/vue/src/main/webapp/app/entities/entity.component.ts.ejs +2 -2
  79. package/generators/entity-server/templates/src/main/java/package/common/delete_template.ejs +7 -3
  80. package/generators/entity-server/templates/src/main/java/package/common/get_all_template.ejs +2 -2
  81. package/generators/entity-server/templates/src/main/java/package/domain/Entity.java.jhi.ejs +15 -5
  82. package/generators/entity-server/templates/src/main/java/package/domain/Entity.java.jhi.spring_data_persistable.ejs +8 -1
  83. package/generators/entity-server/templates/src/main/java/package/repository/EntityRepositoryInternalImpl_reactive.java.ejs +5 -0
  84. package/generators/entity-server/templates/src/main/java/package/service/EntityQueryService.java.ejs +4 -4
  85. package/generators/entity-server/templates/src/main/java/package/service/EntityService.java.ejs +6 -4
  86. package/generators/entity-server/templates/src/main/java/package/service/criteria/EntityCriteria.java.ejs +3 -26
  87. package/generators/entity-server/templates/src/main/java/package/service/dto/EntityDTO.java.ejs +1 -0
  88. package/generators/entity-server/templates/src/main/java/package/service/impl/EntityServiceImpl.java.ejs +1 -1
  89. package/generators/entity-server/templates/src/test/java/package/web/rest/EntityResourceIT.java.ejs +33 -28
  90. package/generators/generate-blueprint/constants.mjs +46 -6
  91. package/generators/generate-blueprint/esm.mjs +0 -0
  92. package/generators/generate-blueprint/files.mjs +7 -5
  93. package/generators/generate-blueprint/generator.mjs +73 -19
  94. package/generators/generate-blueprint/templates/cli/cli.mjs.ejs +0 -0
  95. package/generators/generate-blueprint/templates/generators/generator/generator.spec.mjs.ejs +1 -1
  96. package/generators/generate-blueprint/templates/generators/generator/templates/template-file.ejs +0 -0
  97. package/generators/generator-base-blueprint.js +23 -1
  98. package/generators/generator-base-entities.cjs +5 -1
  99. package/generators/generator-base.js +82 -15
  100. package/generators/generator-constants.js +17 -23
  101. package/generators/init/templates/.husky/pre-commit +0 -0
  102. package/generators/kubernetes/templates/deployment.yml.ejs +1 -1
  103. package/generators/kubernetes/templates/ingress.yml.ejs +1 -1
  104. package/generators/kubernetes/templates/istio/gateway.yml.ejs +1 -1
  105. package/generators/kubernetes/templates/kubectl-apply.sh.ejs +0 -0
  106. package/generators/kubernetes/templates/kustomize/kustomization.yml.ejs +1 -1
  107. package/generators/kubernetes/templates/service.yml.ejs +1 -1
  108. package/generators/kubernetes-knative/templates/istio/gateway.yml.ejs +1 -1
  109. package/generators/kubernetes-knative/templates/kubectl-apply.sh.ejs +0 -0
  110. package/generators/kubernetes-knative/templates/service.yml.ejs +3 -3
  111. package/generators/languages/templates/src/main/webapp/i18n/al/health.json.ejs +1 -1
  112. package/generators/languages/templates/src/main/webapp/i18n/ar-ly/health.json.ejs +1 -1
  113. package/generators/languages/templates/src/main/webapp/i18n/bg/health.json.ejs +1 -1
  114. package/generators/languages/templates/src/main/webapp/i18n/bn/health.json.ejs +1 -1
  115. package/generators/languages/templates/src/main/webapp/i18n/by/health.json.ejs +1 -1
  116. package/generators/languages/templates/src/main/webapp/i18n/ca/health.json.ejs +1 -1
  117. package/generators/languages/templates/src/main/webapp/i18n/cs/health.json.ejs +1 -1
  118. package/generators/languages/templates/src/main/webapp/i18n/da/health.json.ejs +1 -1
  119. package/generators/languages/templates/src/main/webapp/i18n/de/health.json.ejs +1 -1
  120. package/generators/languages/templates/src/main/webapp/i18n/el/activate.json.ejs +1 -1
  121. package/generators/languages/templates/src/main/webapp/i18n/el/health.json.ejs +1 -1
  122. package/generators/languages/templates/src/main/webapp/i18n/el/password.json +1 -1
  123. package/generators/languages/templates/src/main/webapp/i18n/el/register.json +3 -3
  124. package/generators/languages/templates/src/main/webapp/i18n/el/tracker.json +1 -1
  125. package/generators/languages/templates/src/main/webapp/i18n/el/user-management.json +9 -9
  126. package/generators/languages/templates/src/main/webapp/i18n/en/health.json.ejs +1 -1
  127. package/generators/languages/templates/src/main/webapp/i18n/es/health.json.ejs +1 -1
  128. package/generators/languages/templates/src/main/webapp/i18n/et/health.json.ejs +1 -1
  129. package/generators/languages/templates/src/main/webapp/i18n/fa/health.json.ejs +1 -1
  130. package/generators/languages/templates/src/main/webapp/i18n/fi/health.json.ejs +1 -1
  131. package/generators/languages/templates/src/main/webapp/i18n/fr/health.json.ejs +1 -1
  132. package/generators/languages/templates/src/main/webapp/i18n/gl/health.json.ejs +1 -1
  133. package/generators/languages/templates/src/main/webapp/i18n/hi/health.json.ejs +1 -1
  134. package/generators/languages/templates/src/main/webapp/i18n/hr/health.json.ejs +1 -1
  135. package/generators/languages/templates/src/main/webapp/i18n/hu/health.json.ejs +1 -1
  136. package/generators/languages/templates/src/main/webapp/i18n/hy/health.json.ejs +1 -1
  137. package/generators/languages/templates/src/main/webapp/i18n/in/health.json.ejs +1 -1
  138. package/generators/languages/templates/src/main/webapp/i18n/it/health.json.ejs +1 -1
  139. package/generators/languages/templates/src/main/webapp/i18n/ja/health.json.ejs +1 -1
  140. package/generators/languages/templates/src/main/webapp/i18n/ko/health.json.ejs +1 -1
  141. package/generators/languages/templates/src/main/webapp/i18n/mr/health.json.ejs +1 -1
  142. package/generators/languages/templates/src/main/webapp/i18n/my/health.json.ejs +1 -1
  143. package/generators/languages/templates/src/main/webapp/i18n/nl/health.json.ejs +1 -1
  144. package/generators/languages/templates/src/main/webapp/i18n/pa/health.json.ejs +1 -1
  145. package/generators/languages/templates/src/main/webapp/i18n/pl/health.json.ejs +1 -1
  146. package/generators/languages/templates/src/main/webapp/i18n/pt-br/health.json.ejs +1 -1
  147. package/generators/languages/templates/src/main/webapp/i18n/pt-pt/health.json.ejs +1 -1
  148. package/generators/languages/templates/src/main/webapp/i18n/ro/health.json.ejs +1 -1
  149. package/generators/languages/templates/src/main/webapp/i18n/ru/health.json.ejs +1 -1
  150. package/generators/languages/templates/src/main/webapp/i18n/si/health.json.ejs +1 -1
  151. package/generators/languages/templates/src/main/webapp/i18n/sk/health.json.ejs +1 -1
  152. package/generators/languages/templates/src/main/webapp/i18n/sr/health.json.ejs +1 -1
  153. package/generators/languages/templates/src/main/webapp/i18n/sv/health.json.ejs +1 -1
  154. package/generators/languages/templates/src/main/webapp/i18n/ta/health.json.ejs +1 -1
  155. package/generators/languages/templates/src/main/webapp/i18n/te/health.json.ejs +1 -1
  156. package/generators/languages/templates/src/main/webapp/i18n/th/health.json.ejs +1 -1
  157. package/generators/languages/templates/src/main/webapp/i18n/tr/health.json.ejs +1 -1
  158. package/generators/languages/templates/src/main/webapp/i18n/ua/health.json.ejs +1 -1
  159. package/generators/languages/templates/src/main/webapp/i18n/uz-Latn-uz/health.json.ejs +1 -1
  160. package/generators/languages/templates/src/main/webapp/i18n/vi/health.json.ejs +1 -1
  161. package/generators/languages/templates/src/main/webapp/i18n/zh-cn/health.json.ejs +1 -1
  162. package/generators/languages/templates/src/main/webapp/i18n/zh-tw/health.json.ejs +1 -1
  163. package/generators/maven/templates/mvnw +0 -0
  164. package/generators/openshift/templates/deployment.yml.ejs +2 -2
  165. package/generators/server/cleanup-elasticsearch.js +5 -0
  166. package/generators/server/files.js +17 -8
  167. package/generators/server/index.js +0 -2
  168. package/generators/server/templates/build.gradle.ejs +6 -14
  169. package/generators/server/templates/gradle/profile_dev.gradle.ejs +1 -1
  170. package/generators/server/templates/gradle/profile_prod.gradle.ejs +1 -1
  171. package/generators/server/templates/gradle.properties.ejs +6 -4
  172. package/generators/server/templates/gradlew +0 -0
  173. package/generators/server/templates/mvnw +0 -0
  174. package/generators/server/templates/npmw +0 -0
  175. package/generators/server/templates/npmw.cmd +31 -29
  176. package/generators/server/templates/package.json.ejs +2 -2
  177. package/generators/server/templates/pom.xml.ejs +12 -23
  178. package/generators/server/templates/sql/common/src/test/java/package/config/MsSqlTestContainer.java.ejs +2 -3
  179. package/generators/server/templates/src/main/docker/app.yml.ejs +7 -1
  180. package/generators/server/templates/src/main/docker/config/realm-config/jhipster-realm.json.ejs +32 -14
  181. package/generators/server/templates/src/main/docker/jhipster-control-center.yml.ejs +1 -1
  182. package/generators/server/templates/src/main/docker/prometheus/prometheus.yml.ejs +1 -1
  183. package/generators/server/templates/src/main/java/package/Application.java.ejs +11 -4
  184. package/generators/server/templates/src/main/java/package/config/CRLFLogConverter.java.ejs +57 -0
  185. package/generators/server/templates/src/main/java/package/config/EurekaWorkaroundConfiguration.java.ejs +49 -0
  186. package/generators/server/templates/src/main/java/package/config/LoggingConfiguration.java.ejs +4 -4
  187. package/generators/server/templates/src/main/java/package/config/SecurityConfiguration.java.ejs +17 -18
  188. package/generators/server/templates/src/main/java/package/config/SecurityConfiguration_reactive.java.ejs +13 -5
  189. package/generators/server/templates/src/main/java/package/domain/AbstractAuditingEntity.java.ejs +5 -6
  190. package/generators/server/templates/src/main/java/package/domain/User.java.ejs +1 -1
  191. package/generators/server/templates/src/main/java/package/repository/UserRepository.java.ejs +1 -1
  192. package/generators/server/templates/src/main/java/package/security/oauth2/CustomClaimConverter.java.ejs +13 -6
  193. package/generators/server/templates/src/main/java/package/service/dto/AdminUserDTO.java.ejs +3 -1
  194. package/generators/server/templates/src/main/java/package/service/dto/PasswordChangeDTO.java.ejs +5 -1
  195. package/generators/server/templates/src/main/java/package/service/dto/UserDTO.java.ejs +3 -1
  196. package/generators/server/templates/src/main/java/package/web/rest/UserResource.java.ejs +15 -42
  197. package/generators/server/templates/src/main/java/package/web/rest/errors/BadRequestAlertException.java.ejs +1 -0
  198. package/generators/server/templates/src/main/java/package/web/rest/errors/EmailAlreadyUsedException.java.ejs +1 -0
  199. package/generators/server/templates/src/main/java/package/web/rest/errors/InvalidPasswordException.java.ejs +1 -0
  200. package/generators/server/templates/src/main/java/package/web/rest/errors/LoginAlreadyUsedException.java.ejs +1 -0
  201. package/generators/server/templates/src/main/resources/config/application-dev.yml.ejs +1 -1
  202. package/generators/server/templates/src/main/resources/config/application-prod.yml.ejs +3 -3
  203. package/generators/server/templates/src/main/resources/config/application.yml.ejs +4 -2
  204. package/generators/server/templates/src/main/resources/config/liquibase/master.xml.ejs +3 -8
  205. package/generators/server/templates/src/main/resources/logback-spring.xml.ejs +5 -0
  206. package/generators/server/templates/src/test/java/package/config/{ElasticsearchReactiveTestConfiguration.java.ejs → ElasticsearchTestConfiguration.java.ejs} +3 -3
  207. package/generators/server/templates/src/test/java/package/config/ElasticsearchTestContainer.java.ejs +1 -0
  208. package/generators/server/templates/src/test/java/package/config/JHipsterBlockHoundIntegration.java.ejs +3 -0
  209. package/generators/server/templates/src/test/java/package/config/TestContainersSpringContextCustomizerFactory.java.ejs +2 -2
  210. package/generators/sql-constants.js +5 -2
  211. package/generators/utils.js +43 -3
  212. package/generators/workspaces/index.js +2 -1
  213. package/jdl/exporters/jdl-exporter.js +6 -1
  214. package/jdl/jhipster/application-options.js +2 -1
  215. package/jdl/jhipster/binary-options.js +2 -2
  216. package/jdl/jhipster/default-application-options.js +11 -8
  217. package/jdl/jhipster/entity-options.js +1 -0
  218. package/jdl/jhipster/search-engine-types.js +1 -0
  219. package/lib/constants/priorities.cjs +16 -0
  220. package/lib/constants/priorities.mjs +1 -0
  221. package/lib/index.js +2 -0
  222. package/lib/support/base.cjs +2 -1
  223. package/package.json +7 -6
  224. package/utils/blueprint.js +10 -0
  225. package/utils/field.js +9 -9
  226. package/generators/client/templates/react/src/main/webapp/app/config/translation-middleware.ts.ejs +0 -58
  227. package/generators/server/templates/.npmrc.ejs +0 -1
@@ -1,40 +1,242 @@
1
1
  import { convertToParamMap, ParamMap, Params } from '@angular/router';
2
- import { FilterOptions, IFilterOptions } from './filter.model';
2
+ import { FilterOptions, FilterOption } from './filter.model';
3
3
 
4
4
  describe('FilterModel Tests', () => {
5
- const oneValidParam: Params = {
6
- test: 'blub',
7
- 'filter[hello.in]': 'world',
8
- 'filter[invalid': 'invalid',
9
- filter_invalid2: 'invalid',
10
- };
5
+ describe('FilterOption', () => {
6
+ let filterOption: FilterOption;
11
7
 
12
- const noValidParam: Params = {
13
- test: 'blub',
14
- 'filter[invalid': 'invalid',
15
- filter_invalid2: 'invalid',
16
- };
8
+ beforeEach(() => {
9
+ filterOption = new FilterOption('foo', ['bar', 'bar2']);
10
+ });
17
11
 
18
- it('should parse from Params if there are any', () => {
19
- const filters: IFilterOptions = new FilterOptions();
12
+ it('nameAsQueryParam returns query key', () => {
13
+ expect(filterOption.nameAsQueryParam()).toEqual('filter[foo]');
14
+ });
20
15
 
21
- const paramMap: ParamMap = convertToParamMap(oneValidParam);
16
+ describe('addValue', () => {
17
+ it('adds multiples unique values and returns true', () => {
18
+ const ret = filterOption.addValue('bar2', 'bar3', 'bar4');
19
+ expect(filterOption.values).toMatchObject(['bar', 'bar2', 'bar3', 'bar4']);
20
+ expect(ret).toBe(true);
21
+ });
22
+ it("doesn't adds duplicated values and return false", () => {
23
+ const ret = filterOption.addValue('bar', 'bar2');
24
+ expect(filterOption.values).toMatchObject(['bar', 'bar2']);
25
+ expect(ret).toBe(false);
26
+ });
27
+ });
22
28
 
23
- filters.initializeFromParams(paramMap);
29
+ describe('removeValue', () => {
30
+ it('removes the exiting value and return true', () => {
31
+ const ret = filterOption.removeValue('bar');
32
+ expect(filterOption.values).toMatchObject(['bar2']);
33
+ expect(ret).toBe(true);
34
+ });
35
+ it("doesn't removes the value and return false", () => {
36
+ const ret = filterOption.removeValue('foo');
37
+ expect(filterOption.values).toMatchObject(['bar', 'bar2']);
38
+ expect(ret).toBe(false);
39
+ });
40
+ });
24
41
 
25
- expect(filters.hasAnyFilterSet()).toBeTruthy();
26
-
27
- expect(filters.filterOptions[0].name).toBe('hello.in');
28
- expect(filters.filterOptions[0].value).toBe('world');
42
+ describe('equals', () => {
43
+ it('returns true to matching options', () => {
44
+ const otherFilterOption = new FilterOption(filterOption.name, filterOption.values.concat());
45
+ expect(filterOption.equals(otherFilterOption)).toBe(true);
46
+ expect(otherFilterOption.equals(filterOption)).toBe(true);
47
+ });
48
+ it('returns false to different name', () => {
49
+ const otherFilterOption = new FilterOption('bar', filterOption.values.concat());
50
+ expect(filterOption.equals(otherFilterOption)).toBe(false);
51
+ expect(otherFilterOption.equals(filterOption)).toBe(false);
52
+ });
53
+ it('returns false to different values', () => {
54
+ const otherFilterOption = new FilterOption('bar', []);
55
+ expect(filterOption.equals(otherFilterOption)).toBe(false);
56
+ expect(otherFilterOption.equals(filterOption)).toBe(false);
57
+ });
58
+ });
29
59
  });
30
60
 
31
- it('should parse from Params and have none if there are none', () => {
32
- const filters: IFilterOptions = new FilterOptions();
61
+ describe('FilterOptions', () => {
62
+ describe('hasAnyFilterSet', () => {
63
+ it('with empty options returns false', () => {
64
+ const filters = new FilterOptions();
65
+ expect(filters.hasAnyFilterSet()).toBe(false);
66
+ });
67
+ it('with options and empty values returns false', () => {
68
+ const filters = new FilterOptions([new FilterOption('foo'), new FilterOption('bar')]);
69
+ expect(filters.hasAnyFilterSet()).toBe(false);
70
+ });
71
+ it('with option and value returns true', () => {
72
+ const filters = new FilterOptions([new FilterOption('foo', ['bar'])]);
73
+ expect(filters.hasAnyFilterSet()).toBe(true);
74
+ });
75
+ });
76
+
77
+ describe('clear', () => {
78
+ it("removes empty filters and dosn't emit next element", () => {
79
+ const filters = new FilterOptions([new FilterOption('foo'), new FilterOption('bar')]);
80
+ jest.spyOn(filters.filterChanges, 'next');
81
+
82
+ filters.clear();
83
+
84
+ expect(filters.filterChanges.next).not.toBeCalled();
85
+ expect(filters.filterOptions).toMatchObject([]);
86
+ });
87
+ it('removes empty filters and emits next element', () => {
88
+ const filters = new FilterOptions([new FilterOption('foo', ['existingFoo1']), new FilterOption('bar')]);
89
+ jest.spyOn(filters.filterChanges, 'next');
90
+
91
+ filters.clear();
92
+
93
+ expect(filters.filterChanges.next).toHaveBeenCalledTimes(1);
94
+ expect(filters.filterOptions).toMatchObject([]);
95
+ });
96
+ });
97
+
98
+ describe('addFilter', () => {
99
+ it('adds a non existing FilterOption, returns true and emit next element', () => {
100
+ const filters = new FilterOptions([new FilterOption('foo', ['existingFoo1', 'existingFoo2']), new FilterOption('bar')]);
101
+ jest.spyOn(filters.filterChanges, 'next');
102
+
103
+ const result = filters.addFilter('addedFilter', 'addedValue');
104
+
105
+ expect(result).toBe(true);
106
+ expect(filters.filterChanges.next).toHaveBeenCalledTimes(1);
107
+ expect(filters.filterOptions).toMatchObject([
108
+ { name: 'foo', values: ['existingFoo1', 'existingFoo2'] },
109
+ { name: 'addedFilter', values: ['addedValue'] },
110
+ ]);
111
+ });
112
+ it('adds a non existing value to FilterOption, returns true and emit next element', () => {
113
+ const filters = new FilterOptions([new FilterOption('foo', ['existingFoo1', 'existingFoo2']), new FilterOption('bar')]);
114
+ jest.spyOn(filters.filterChanges, 'next');
115
+
116
+ const result = filters.addFilter('foo', 'addedValue1', 'addedValue2');
117
+
118
+ expect(result).toBe(true);
119
+ expect(filters.filterChanges.next).toHaveBeenCalledTimes(1);
120
+ expect(filters.filterOptions).toMatchObject([
121
+ { name: 'foo', values: ['existingFoo1', 'existingFoo2', 'addedValue1', 'addedValue2'] },
122
+ ]);
123
+ });
124
+ it("doesn't add FilterOption values already added, returns false and doesn't emit next element", () => {
125
+ const filters = new FilterOptions([new FilterOption('foo', ['existingFoo1', 'existingFoo2']), new FilterOption('bar')]);
126
+ jest.spyOn(filters.filterChanges, 'next');
127
+
128
+ const result = filters.addFilter('foo', 'existingFoo1', 'existingFoo2');
129
+
130
+ expect(result).toBe(false);
131
+ expect(filters.filterChanges.next).not.toBeCalled();
132
+ expect(filters.filterOptions).toMatchObject([{ name: 'foo', values: ['existingFoo1', 'existingFoo2'] }]);
133
+ });
134
+ });
135
+
136
+ describe('removeFilter', () => {
137
+ it('removes an existing FilterOptions and returns true', () => {
138
+ const filters = new FilterOptions([new FilterOption('foo', ['existingFoo1', 'existingFoo2']), new FilterOption('bar')]);
139
+ jest.spyOn(filters.filterChanges, 'next');
140
+
141
+ const result = filters.removeFilter('foo', 'existingFoo1');
142
+
143
+ expect(result).toBe(true);
144
+ expect(filters.filterChanges.next).toHaveBeenCalledTimes(1);
145
+ expect(filters.filterOptions).toMatchObject([{ name: 'foo', values: ['existingFoo2'] }]);
146
+ });
147
+ it("doesn't remove a non existing FilterOptions values returns false", () => {
148
+ const filters = new FilterOptions([new FilterOption('foo', ['existingFoo1', 'existingFoo2']), new FilterOption('bar')]);
149
+ jest.spyOn(filters.filterChanges, 'next');
150
+
151
+ const result = filters.removeFilter('foo', 'nonExisting1');
152
+
153
+ expect(result).toBe(false);
154
+ expect(filters.filterChanges.next).not.toBeCalled();
155
+ expect(filters.filterOptions).toMatchObject([{ name: 'foo', values: ['existingFoo1', 'existingFoo2'] }]);
156
+ });
157
+ it("doesn't remove a non existing FilterOptions returns false", () => {
158
+ const filters = new FilterOptions([new FilterOption('foo', ['existingFoo1', 'existingFoo2']), new FilterOption('bar')]);
159
+ jest.spyOn(filters.filterChanges, 'next');
160
+
161
+ const result = filters.removeFilter('nonExisting', 'nonExisting1');
162
+
163
+ expect(result).toBe(false);
164
+ expect(filters.filterChanges.next).not.toBeCalled();
165
+ expect(filters.filterOptions).toMatchObject([{ name: 'foo', values: ['existingFoo1', 'existingFoo2'] }]);
166
+ });
167
+ });
168
+
169
+ describe('initializeFromParams', () => {
170
+ const oneValidParam: Params = {
171
+ test: 'blub',
172
+ 'filter[hello.in]': 'world',
173
+ 'filter[invalid': 'invalid',
174
+ filter_invalid2: 'invalid',
175
+ };
176
+
177
+ const noValidParam: Params = {
178
+ test: 'blub',
179
+ 'filter[invalid': 'invalid',
180
+ filter_invalid2: 'invalid',
181
+ };
182
+
183
+ const paramWithTwoValues: Params = {
184
+ 'filter[hello.in]': ['world', 'world2'],
185
+ };
186
+
187
+ const paramWithTwoKeys: Params = {
188
+ 'filter[hello.in]': ['world', 'world2'],
189
+ 'filter[hello.notIn]': ['world3', 'world4'],
190
+ };
191
+
192
+ it('should parse from Params if there are any and not emit next element', () => {
193
+ const filters: FilterOptions = new FilterOptions([new FilterOption('foo', ['bar'])]);
194
+ jest.spyOn(filters.filterChanges, 'next');
195
+ const paramMap: ParamMap = convertToParamMap(oneValidParam);
196
+
197
+ filters.initializeFromParams(paramMap);
198
+
199
+ expect(filters.filterChanges.next).not.toHaveBeenCalled();
200
+ expect(filters.filterOptions).toMatchObject([{ name: 'hello.in', values: ['world'] }]);
201
+ });
202
+
203
+ it('should parse from Params and have none if there are none', () => {
204
+ const filters: FilterOptions = new FilterOptions();
205
+ const paramMap: ParamMap = convertToParamMap(noValidParam);
206
+ jest.spyOn(filters.filterChanges, 'next');
207
+
208
+ filters.initializeFromParams(paramMap);
209
+
210
+ expect(filters.filterChanges.next).not.toHaveBeenCalled();
211
+ expect(filters.filterOptions).toMatchObject([]);
212
+ });
213
+
214
+ it('should parse from Params and have a parameter with 2 values and one aditional value', () => {
215
+ const filters: FilterOptions = new FilterOptions([new FilterOption('hello.in', ['world'])]);
216
+ jest.spyOn(filters.filterChanges, 'next');
217
+
218
+ const paramMap: ParamMap = convertToParamMap(paramWithTwoValues);
219
+
220
+ filters.initializeFromParams(paramMap);
221
+
222
+ expect(filters.filterChanges.next).not.toHaveBeenCalled();
223
+ expect(filters.filterOptions).toMatchObject([{ name: 'hello.in', values: ['world', 'world2'] }]);
224
+ });
225
+
226
+ it('should parse from Params and have a parameter with 2 keys', () => {
227
+ const filters: FilterOptions = new FilterOptions();
228
+ jest.spyOn(filters.filterChanges, 'next');
33
229
 
34
- const paramMap: ParamMap = convertToParamMap(noValidParam);
230
+ const paramMap: ParamMap = convertToParamMap(paramWithTwoKeys);
35
231
 
36
- filters.initializeFromParams(paramMap);
232
+ filters.initializeFromParams(paramMap);
37
233
 
38
- expect(filters.hasAnyFilterSet()).toBeFalsy();
234
+ expect(filters.filterChanges.next).not.toHaveBeenCalled();
235
+ expect(filters.filterOptions).toMatchObject([
236
+ { name: 'hello.in', values: ['world', 'world2'] },
237
+ { name: 'hello.notIn', values: ['world3', 'world4'] },
238
+ ]);
239
+ });
240
+ });
39
241
  });
40
242
  });
@@ -1,80 +1,97 @@
1
1
  import { ParamMap } from '@angular/router';
2
+ import { Subject } from 'rxjs';
2
3
 
3
4
  export interface IFilterOptions {
4
- containsSameOption(option: IFilterOption): unknown;
5
- filterOptions: IFilterOption[];
5
+ readonly filterChanges: Subject<FilterOption[]>;
6
+ get filterOptions(): IFilterOption[];
6
7
  hasAnyFilterSet(): boolean;
7
- clear(): void;
8
- removeByName(name: string): void;
8
+ clear(): boolean;
9
9
  initializeFromParams(params: ParamMap): boolean;
10
- equals(other: IFilterOptions): boolean;
11
- clone(): IFilterOptions;
10
+ addFilter(name: string, ...values: string[]): boolean;
11
+ removeFilter(name: string, value: string): boolean;
12
12
  }
13
13
 
14
14
  export interface IFilterOption {
15
15
  name: string;
16
- value: string | null;
17
- isSet(): boolean;
16
+ values: string[];
18
17
  nameAsQueryParam(): string;
19
18
  }
20
19
 
21
- export interface IFilterableComponent {
22
- clearFilter(filterName: string): void;
23
- clearAllFilters(): void;
24
- }
25
-
26
20
  export class FilterOption implements IFilterOption {
27
- constructor(public name: string, public value: string | null) {}
21
+ constructor(public name: string, public values: string[] = []) {
22
+ this.values = [...new Set(values)];
23
+ }
28
24
 
29
25
  nameAsQueryParam(): string {
30
26
  return 'filter[' + this.name + ']';
31
27
  }
32
28
 
33
29
  isSet(): boolean {
34
- return this.value != null && this.value.length > 0;
30
+ return this.values.length > 0;
35
31
  }
36
- }
37
32
 
38
- export class FilterOptions implements IFilterOptions {
39
- filterOptions: IFilterOption[] = [];
40
-
41
- hasAnyFilterSet(): boolean {
42
- return this.filterOptions.length > 0 && this.filterOptions.every(e => e.isSet());
33
+ addValue(...values: string[]): boolean {
34
+ const missingValues = values.filter(value => value && !this.values.includes(value));
35
+ if (missingValues.length > 0) {
36
+ this.values.push(...missingValues);
37
+ return true;
38
+ }
39
+ return false;
43
40
  }
44
41
 
45
- clear(): void {
46
- this.filterOptions = [];
47
- }
42
+ removeValue(value: string): boolean {
43
+ const indexOf = this.values.indexOf(value);
44
+ if (indexOf === -1) {
45
+ return false;
46
+ }
48
47
 
49
- add(option: IFilterOption): void {
50
- this.filterOptions.push(option);
48
+ this.values.splice(indexOf, 1);
49
+ return true;
51
50
  }
52
51
 
53
- removeByName(name: string): void {
54
- this.filterOptions = this.filterOptions.filter(option => option.name !== name);
52
+ clone(): FilterOption {
53
+ return new FilterOption(this.name, this.values.concat());
55
54
  }
56
55
 
57
- equals(other: IFilterOptions): boolean {
56
+ equals(other: IFilterOption): boolean {
58
57
  return (
59
- this.filterOptions.every(thisOption => other.containsSameOption(thisOption)) &&
60
- other.filterOptions.every(otherOption => this.containsSameOption(otherOption))
58
+ this.name === other.name &&
59
+ this.values.length === other.values.length &&
60
+ this.values.every(thisValue => other.values.includes(thisValue)) &&
61
+ other.values.every(otherValue => this.values.includes(otherValue))
61
62
  );
62
63
  }
64
+ }
63
65
 
64
- clone(): IFilterOptions {
65
- const newObject: FilterOptions = new FilterOptions();
66
+ export class FilterOptions implements IFilterOptions {
67
+ readonly filterChanges: Subject<FilterOption[]> = new Subject();
68
+ private _filterOptions: FilterOption[];
66
69
 
67
- this.filterOptions.forEach(option => {
68
- newObject.add(new FilterOption(option.name, option.value));
69
- });
70
+ constructor(filterOptions: FilterOption[] = []) {
71
+ this._filterOptions = filterOptions;
72
+ }
70
73
 
71
- return newObject;
74
+ get filterOptions(): FilterOption[] {
75
+ return this._filterOptions.filter(option => option.isSet());
76
+ }
77
+
78
+ hasAnyFilterSet(): boolean {
79
+ return this._filterOptions.some(e => e.isSet());
80
+ }
81
+
82
+ clear(): boolean {
83
+ const hasFields = this.hasAnyFilterSet();
84
+ this._filterOptions = [];
85
+ if (hasFields) {
86
+ this.changed();
87
+ }
88
+ return hasFields;
72
89
  }
73
90
 
74
91
  initializeFromParams(params: ParamMap): boolean {
75
- const oldFilters: IFilterOptions = this.clone();
92
+ const oldFilters: FilterOptions = this.clone();
76
93
 
77
- this.clear();
94
+ this._filterOptions = [];
78
95
 
79
96
  const filterRegex = /filter\[(.+)\]/;
80
97
  params.keys
@@ -82,14 +99,58 @@ export class FilterOptions implements IFilterOptions {
82
99
  .forEach(matchingParam => {
83
100
  const matches = matchingParam.match(filterRegex);
84
101
  if (matches && matches.length > 1) {
85
- this.add(new FilterOption(matches[1], params.get(matchingParam)));
102
+ this.getFilterOptionByName(matches[1], true).addValue(...params.getAll(matchingParam));
86
103
  }
87
104
  });
88
105
 
89
- return !oldFilters.equals(this);
106
+ if (oldFilters.equals(this)) {
107
+ return false;
108
+ }
109
+ return true;
110
+ }
111
+
112
+ addFilter(name: string, ...values: string[]): boolean {
113
+ if (this.getFilterOptionByName(name, true).addValue(...values)) {
114
+ this.changed();
115
+ return true;
116
+ }
117
+ return false;
90
118
  }
91
119
 
92
- containsSameOption(optionToSearch: IFilterOption): boolean {
93
- return this.filterOptions.some(option => option.name === optionToSearch.name && option.value === optionToSearch.value);
120
+ removeFilter(name: string, value: string): boolean {
121
+ if (this.getFilterOptionByName(name)?.removeValue(value)) {
122
+ this.changed();
123
+ return true;
124
+ }
125
+ return false;
126
+ }
127
+
128
+ protected changed(): void {
129
+ this.filterChanges.next(this.filterOptions.map(option => option.clone()));
130
+ }
131
+
132
+ protected equals(other: FilterOptions): boolean {
133
+ const thisFilters = this.filterOptions;
134
+ const otherFilters = other.filterOptions;
135
+ if (thisFilters.length !== otherFilters.length) {
136
+ return false;
137
+ }
138
+ return thisFilters.every(option => other.getFilterOptionByName(option.name)?.equals(option));
139
+ }
140
+
141
+ protected clone(): FilterOptions {
142
+ return new FilterOptions(this.filterOptions.map(option => new FilterOption(option.name, option.values.concat())));
143
+ }
144
+
145
+ protected getFilterOptionByName(name: string, add: true): FilterOption;
146
+ protected getFilterOptionByName(name: string, add: false): FilterOption | null;
147
+ protected getFilterOptionByName(name: string): FilterOption | null;
148
+ protected getFilterOptionByName(name: string, add = false): FilterOption | null {
149
+ const addOption = (option: FilterOption): FilterOption => {
150
+ this._filterOptions.push(option);
151
+ return option;
152
+ };
153
+
154
+ return this._filterOptions.find(thisOption => thisOption.name === name) ?? (add ? addOption(new FilterOption(name)) : null);
94
155
  }
95
156
  }
@@ -182,6 +182,14 @@ Custom alerts for notification
182
182
  }
183
183
  }
184
184
 
185
+ /* ==========================================================================
186
+ entity list page css
187
+ ========================================================================== */
188
+
189
+ .table-entities thead th .d-flex > * {
190
+ margin: auto 0;
191
+ }
192
+
185
193
  /* ==========================================================================
186
194
  entity detail page css
187
195
  ========================================================================== */
@@ -17,7 +17,6 @@
17
17
  limitations under the License.
18
18
  -%>
19
19
  {
20
- "include": [],
21
20
  "compilerOptions": {
22
21
  "baseUrl": "<%= CLIENT_MAIN_SRC_DIR %>",
23
22
  "outDir": "./<%= DIST_DIR %>",
@@ -18,10 +18,9 @@
18
18
  -%>
19
19
  {
20
20
  "extends": "./tsconfig.json",
21
+ "include": ["<%= MAIN_SRC_DIR %>**/*.ts"],
21
22
  "compilerOptions": {
22
23
  "outDir": "<%= BUILD_DIR %>out-tsc/spec",
23
24
  "types": ["jest", "node"]
24
- },
25
- "files": ["<%= MAIN_SRC_DIR %>polyfills.ts"],
26
- "include": ["<%= MAIN_SRC_DIR %>**/*.ts"]
25
+ }
27
26
  }
@@ -33,9 +33,6 @@ module.exports = (config, options, targetOptions) => {
33
33
  <%_ } _%>
34
34
  './entity-navbar-items': 'app/entities/entity-navbar-items.ts',
35
35
  './entity-routing': 'app/entities/entity-routing.module.ts',
36
- <%_ for (entity of Object.values(this.configOptions.sharedEntities || {}).filter(e => e.microserviceName)) { _%>
37
- './<%= entity.entityFileName %>': 'app/entities/<%= entity.entityFolderName %>/<%= entity.entityFileName %>.module.ts',
38
- <%_ } _%>
39
36
  },
40
37
  <%_ } _%>
41
38
  <%_ if (applicationTypeGateway) { _%>
@@ -3,14 +3,14 @@
3
3
  "@cypress/code-coverage": "3.10.0",
4
4
  "babel-loader": "8.2.5",
5
5
  "babel-plugin-istanbul": "6.1.1",
6
- "cypress": "10.3.1",
6
+ "cypress": "10.7.0",
7
7
  "cypress-audit": "1.1.0",
8
8
  "eslint-plugin-cypress": "2.12.1",
9
- "lighthouse": "9.6.4",
9
+ "lighthouse": "9.6.6",
10
10
  "nyc": "15.1.0",
11
- "swagger-ui-dist": "4.13.0"
11
+ "swagger-ui-dist": "4.14.0"
12
12
  },
13
13
  "dependencies": {
14
- "dayjs": "1.11.4"
14
+ "dayjs": "1.11.5"
15
15
  }
16
16
  }
@@ -74,7 +74,7 @@
74
74
 
75
75
  const baseUrl = '/v3/api-docs';
76
76
  let urls;
77
- <%_ if (!applicationTypeMonolith && serviceDiscoveryType) { _%>
77
+ <%_ if (!applicationTypeMonolith && serviceDiscoveryAny) { _%>
78
78
 
79
79
  try {
80
80
  const response = await axios.get('/management/health/discoveryComposite', axiosConfig);
@@ -20,9 +20,9 @@ module.exports = {
20
20
  }),
21
21
  reporters: [
22
22
  'default',
23
- [ 'jest-junit', { outputDirectory: './<%= BUILD_DIR %>test-results/', outputName: 'TESTS-results-jest.xml' } ]
23
+ ['jest-junit', { outputDirectory: './<%= BUILD_DIR %>test-results/', outputName: 'TESTS-results-jest.xml' }],
24
+ ['jest-sonar', { outputDirectory: './<%= BUILD_DIR %>test-results/jest', outputName: 'TESTS-results-sonar.xml' }],
24
25
  ],
25
- testResultsProcessor: 'jest-sonar-reporter',
26
26
  testPathIgnorePatterns: [
27
27
  '<rootDir>/node_modules/'
28
28
  ],