generator-jhipster 8.0.0 → 8.1.0

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 (258) hide show
  1. package/README.md +61 -57
  2. package/dist/cli/environment-builder.mjs +11 -4
  3. package/dist/cli/program.mjs +1 -1
  4. package/dist/generators/angular/cleanup.mjs +7 -0
  5. package/dist/generators/angular/files-angular.mjs +3 -4
  6. package/dist/generators/angular/generator.mjs +2 -15
  7. package/dist/generators/angular/needle-api/needle-client-angular.mjs +2 -8
  8. package/dist/generators/angular/resources/package.json +23 -23
  9. package/dist/generators/angular/support/translate-angular.mjs +2 -2
  10. package/dist/generators/angular/templates/README.md.jhi.client.angular.ejs +1 -1
  11. package/dist/generators/angular/templates/angular.json.ejs +3 -7
  12. package/dist/generators/angular/templates/src/main/webapp/app/account/activate/activate.component.html.ejs +6 -4
  13. package/dist/generators/angular/templates/src/main/webapp/app/account/password/password-strength-bar/password-strength-bar.component.ts.ejs +1 -1
  14. package/dist/generators/angular/templates/src/main/webapp/app/account/password/password.component.html.ejs +39 -33
  15. package/dist/generators/angular/templates/src/main/webapp/app/account/password-reset/finish/password-reset-finish.component.html.ejs +44 -36
  16. package/dist/generators/angular/templates/src/main/webapp/app/account/password-reset/init/password-reset-init.component.html.ejs +24 -23
  17. package/dist/generators/angular/templates/src/main/webapp/app/account/register/register.component.html.ejs +74 -62
  18. package/dist/generators/angular/templates/src/main/webapp/app/account/sessions/sessions.component.html.ejs +12 -4
  19. package/dist/generators/angular/templates/src/main/webapp/app/account/settings/settings.component.html.ejs +54 -48
  20. package/dist/generators/angular/templates/src/main/webapp/app/admin/admin.routes.ts.ejs +74 -0
  21. package/dist/generators/angular/templates/src/main/webapp/app/admin/configuration/configuration.component.html.ejs +15 -5
  22. package/dist/generators/angular/templates/src/main/webapp/app/admin/docs/docs.component.ts.ejs +1 -1
  23. package/dist/generators/angular/templates/src/main/webapp/app/admin/gateway/gateway.component.html.ejs +20 -7
  24. package/dist/generators/angular/templates/src/main/webapp/app/admin/health/health.component.html.ejs +10 -7
  25. package/dist/generators/angular/templates/src/main/webapp/app/admin/health/modal/health-modal.component.html.ejs +9 -3
  26. package/dist/generators/angular/templates/src/main/webapp/app/admin/logs/logs.component.html.ejs +12 -4
  27. package/dist/generators/angular/templates/src/main/webapp/app/admin/metrics/blocks/jvm-memory/jvm-memory.component.html.ejs +13 -7
  28. package/dist/generators/angular/templates/src/main/webapp/app/admin/metrics/blocks/metrics-cache/metrics-cache.component.html.ejs +6 -2
  29. package/dist/generators/angular/templates/src/main/webapp/app/admin/metrics/blocks/metrics-datasource/metrics-datasource.component.html.ejs +3 -1
  30. package/dist/generators/angular/templates/src/main/webapp/app/admin/metrics/blocks/metrics-endpoints-requests/metrics-endpoints-requests.component.html.ejs +13 -9
  31. package/dist/generators/angular/templates/src/main/webapp/app/admin/metrics/blocks/metrics-garbagecollector/metrics-garbagecollector.component.html.ejs +13 -5
  32. package/dist/generators/angular/templates/src/main/webapp/app/admin/metrics/blocks/metrics-modal-threads/metrics-modal-threads.component.html.ejs +21 -7
  33. package/dist/generators/angular/templates/src/main/webapp/app/admin/metrics/blocks/metrics-request/metrics-request.component.html.ejs +6 -2
  34. package/dist/generators/angular/templates/src/main/webapp/app/admin/metrics/blocks/metrics-system/metrics-system.component.html.ejs +3 -1
  35. package/dist/generators/angular/templates/src/main/webapp/app/admin/metrics/metrics.component.html.ejs +16 -7
  36. package/dist/generators/angular/templates/src/main/webapp/app/admin/tracker/tracker.component.html.ejs +3 -1
  37. package/dist/generators/angular/templates/src/main/webapp/app/admin/user-management/delete/user-management-delete-dialog.component.html.ejs +3 -1
  38. package/dist/generators/angular/templates/src/main/webapp/app/admin/user-management/detail/user-management-detail.component.html.ejs +11 -4
  39. package/dist/generators/angular/templates/src/main/webapp/app/admin/user-management/list/user-management.component.html.ejs +20 -11
  40. package/dist/generators/angular/templates/src/main/webapp/app/admin/user-management/update/user-management-update.component.html.ejs +48 -34
  41. package/dist/generators/angular/templates/src/main/webapp/app/app.component.ts.ejs +73 -0
  42. package/dist/generators/angular/templates/src/main/webapp/app/app.config.ts.ejs +67 -0
  43. package/dist/generators/angular/templates/src/main/webapp/app/app.routes.ts.ejs +85 -0
  44. package/dist/generators/angular/templates/src/main/webapp/app/core/microfrontend/index.ts.ejs +5 -4
  45. package/dist/generators/angular/templates/src/main/webapp/app/core/util/alert.service.spec.ts.ejs +1 -1
  46. package/dist/generators/angular/templates/src/main/webapp/app/core/util/data-util.service.ts.ejs +2 -2
  47. package/dist/generators/angular/templates/src/main/webapp/app/core/util/event-manager.service.spec.ts.ejs +12 -12
  48. package/dist/generators/angular/templates/src/main/webapp/app/entities/_entityFolder_/_entityFile_.model.ts.ejs +4 -4
  49. package/dist/generators/angular/templates/src/main/webapp/app/entities/_entityFolder_/delete/_entityFile_-delete-dialog.component.html.ejs +3 -1
  50. package/dist/generators/angular/templates/src/main/webapp/app/entities/_entityFolder_/detail/_entityFile_-detail.component.html.ejs +26 -14
  51. package/dist/generators/angular/templates/src/main/webapp/app/entities/_entityFolder_/list/_entityFile_.component.html.ejs +38 -25
  52. package/dist/generators/angular/templates/src/main/webapp/app/entities/_entityFolder_/list/_entityFile_.component.ts.ejs +1 -1
  53. package/dist/generators/angular/templates/src/main/webapp/app/entities/_entityFolder_/update/_entityFile_-form.service.spec.ts.ejs +2 -2
  54. package/dist/generators/angular/templates/src/main/webapp/app/entities/_entityFolder_/update/_entityFile_-form.service.ts.ejs +5 -12
  55. package/dist/generators/angular/templates/src/main/webapp/app/entities/_entityFolder_/update/_entityFile_-update.component.html.ejs +55 -21
  56. package/dist/generators/angular/templates/src/main/webapp/app/entities/_entityFolder_/update/_entityFile_-update.component.spec.ts.ejs +2 -2
  57. package/dist/generators/angular/templates/src/main/webapp/app/entities/_entityFolder_/update/_entityFile_-update.component.ts.ejs +10 -10
  58. package/dist/generators/angular/templates/src/main/webapp/app/entities/entity.routes.ts.ejs +25 -0
  59. package/dist/generators/angular/templates/src/main/webapp/app/home/home.component.html.ejs +21 -17
  60. package/dist/generators/angular/templates/src/main/webapp/app/home/home.component.ts.ejs +1 -1
  61. package/dist/generators/angular/templates/src/main/webapp/app/layouts/error/error.component.html.ejs +3 -3
  62. package/dist/generators/angular/templates/src/main/webapp/app/layouts/main/main.component.spec.ts.ejs +5 -2
  63. package/dist/generators/angular/templates/src/main/webapp/app/layouts/main/main.component.ts.ejs +5 -1
  64. package/dist/generators/angular/templates/src/main/webapp/app/layouts/navbar/navbar.component.html.ejs +97 -78
  65. package/dist/generators/angular/templates/src/main/webapp/app/layouts/navbar/navbar.component.ts.ejs +1 -1
  66. package/dist/generators/angular/templates/src/main/webapp/app/layouts/profiles/page-ribbon.component.scss.ejs +1 -1
  67. package/dist/generators/angular/templates/src/main/webapp/app/layouts/profiles/page-ribbon.component.ts.ejs +6 -4
  68. package/dist/generators/angular/templates/src/main/webapp/app/login/login.component.html.ejs +3 -3
  69. package/dist/generators/angular/templates/src/main/webapp/app/shared/alert/alert-error.component.html.ejs +6 -2
  70. package/dist/generators/angular/templates/src/main/webapp/app/shared/alert/alert.component.html.ejs +6 -2
  71. package/dist/generators/angular/templates/src/main/webapp/app/shared/filter/filter.component.html.ejs +11 -7
  72. package/dist/generators/angular/templates/src/main/webapp/app/shared/filter/filter.model.spec.ts.ejs +1 -1
  73. package/dist/generators/angular/templates/src/main/webapp/app/shared/sort/sort-by.directive.spec.ts.ejs +3 -3
  74. package/dist/generators/angular/templates/src/main/webapp/bootstrap.ts.ejs +5 -5
  75. package/dist/generators/angular/templates/src/main/webapp/content/scss/global.scss.ejs +1 -1
  76. package/dist/generators/angular/templates/webpack/webpack.microfrontend.js.ejs +2 -2
  77. package/dist/generators/app/README.md +108 -0
  78. package/dist/generators/app/USAGE +3 -0
  79. package/dist/generators/app/command.mjs +3 -3
  80. package/dist/generators/app/generator.mjs +11 -0
  81. package/dist/generators/base/command.mjs +0 -11
  82. package/dist/generators/base-application/generator.mjs +5 -6
  83. package/dist/generators/base-application/support/entities.mjs +2 -2
  84. package/dist/generators/base-application/support/index.mjs +1 -0
  85. package/dist/generators/base-application/support/prepare-entity.mjs +0 -1
  86. package/dist/generators/base-application/support/prepare-relationship.mjs +4 -0
  87. package/dist/generators/base-application/support/update-application-entities-transform.mjs +52 -0
  88. package/dist/generators/base-core/generator.mjs +17 -4
  89. package/dist/generators/base-entity-changes/generator.mjs +1 -1
  90. package/dist/generators/bootstrap/command.mjs +6 -0
  91. package/dist/generators/bootstrap/generator.mjs +27 -9
  92. package/dist/generators/bootstrap-application/generator.mjs +1 -19
  93. package/dist/generators/bootstrap-application-base/command.mjs +30 -0
  94. package/dist/generators/bootstrap-application-base/generator.mjs +27 -5
  95. package/dist/generators/bootstrap-application-base/index.mjs +1 -0
  96. package/dist/generators/bootstrap-application-base/support/export-jdl-transform.mjs +61 -0
  97. package/dist/generators/bootstrap-application-base/support/import-jdl-transform.mjs +64 -0
  98. package/dist/generators/bootstrap-application-base/support/index.mjs +2 -0
  99. package/dist/generators/client/command.mjs +2 -0
  100. package/dist/generators/client/resources/package.json +4 -4
  101. package/dist/generators/client/support/entity-definition.mjs +3 -3
  102. package/dist/generators/client/templates/README.md.jhi.client.ejs +2 -2
  103. package/dist/generators/client/templates/src/main/webapp/index.html.ejs +2 -2
  104. package/dist/generators/common/command.mjs +2 -0
  105. package/dist/generators/common/resources/package.json +3 -3
  106. package/dist/generators/common/templates/sonar-project.properties.ejs +1 -1
  107. package/dist/generators/cypress/templates/src/test/javascript/cypress/e2e/entity/_entity_.cy.ts.ejs +0 -1
  108. package/dist/generators/docker/generator.mjs +1 -1
  109. package/dist/generators/docker/templates/docker/cassandra.yml.ejs +2 -2
  110. package/dist/generators/docker/templates/docker/keycloak.yml.ejs +1 -1
  111. package/dist/generators/docker/templates/docker/realm-config/jhipster-realm.json.ejs +4 -1
  112. package/dist/generators/docker-compose/generator.mjs +4 -11
  113. package/dist/generators/docker-compose/templates/docker-compose.yml.ejs +1 -1
  114. package/dist/generators/docker-compose/templates/realm-config/jhipster-realm.json.ejs +4 -1
  115. package/dist/generators/export-jdl/generator.mjs +1 -1
  116. package/dist/generators/feign-client/cleanup.mjs +12 -0
  117. package/dist/generators/feign-client/files.mjs +35 -0
  118. package/dist/generators/feign-client/generator.mjs +65 -0
  119. package/dist/generators/feign-client/index.mjs +19 -0
  120. package/dist/generators/feign-client/templates/src/main/java/_package_/client/AuthorizationHeaderUtil.java.ejs +174 -0
  121. package/dist/generators/feign-client/templates/src/main/java/_package_/client/AuthorizedFeignClient.java.ejs +72 -0
  122. package/dist/generators/feign-client/templates/src/main/java/_package_/client/OAuth2InterceptedFeignConfiguration.java.ejs +35 -0
  123. package/dist/generators/feign-client/templates/src/main/java/_package_/client/OAuthIdpTokenResponseDTO.java.ejs +161 -0
  124. package/dist/generators/feign-client/templates/src/main/java/_package_/client/TokenRelayRequestInterceptor.java.ejs +42 -0
  125. package/dist/generators/feign-client/templates/src/main/java/_package_/client/UserFeignClientInterceptor_jwt.java.ejs +36 -0
  126. package/dist/generators/feign-client/templates/src/main/java/_package_/config/FeignConfiguration.java.ejs +45 -0
  127. package/dist/generators/feign-client/templates/src/test/java/_package_/client/AuthorizationHeaderUtilTest.java.ejs +263 -0
  128. package/dist/generators/generate-blueprint/command.mjs +1 -1
  129. package/dist/generators/generate-blueprint/resources/package.json +1 -1
  130. package/dist/generators/generate-blueprint/templates/vitest.config.ts.ejs +1 -1
  131. package/dist/generators/generator-constants.mjs +9 -5
  132. package/dist/generators/generator-list.mjs +1 -0
  133. package/dist/generators/git/generator.mjs +3 -5
  134. package/dist/generators/gradle/constants.mjs +1 -1
  135. package/dist/generators/java/command.mjs +6 -0
  136. package/dist/generators/java/entity-files.mjs +4 -0
  137. package/dist/generators/java/generator.mjs +3 -2
  138. package/dist/generators/java/templates/src/main/java/_package_/_entityPackage_/domain/_persistClass_.java.jhi.jackson_identity_info.ejs +30 -0
  139. package/dist/generators/jdl/generator.mjs +18 -23
  140. package/dist/generators/kubernetes/templates/keycloak/keycloak-configmap.yml.ejs +4 -1
  141. package/dist/generators/kubernetes/templates/keycloak/keycloak.yml.ejs +1 -1
  142. package/dist/generators/languages/generator.mjs +24 -15
  143. package/dist/generators/languages/prompts.mjs +3 -1
  144. package/dist/generators/languages/support/translate.mjs +1 -1
  145. package/dist/generators/languages/templates/entity/i18n/entity_pt-br.json.ejs +1 -1
  146. package/dist/generators/liquibase/README.md +19 -0
  147. package/dist/generators/project-name/generator.mjs +14 -19
  148. package/dist/generators/project-name/support/name-resolver.mjs +35 -6
  149. package/dist/generators/react/resources/package.json +24 -24
  150. package/dist/generators/react/templates/src/main/webapp/app/config/notification-middleware.spec.ts.ejs +4 -4
  151. package/dist/generators/react/templates/src/main/webapp/app/entities/_entityFolder_/_entityFile_-detail.tsx.ejs +1 -2
  152. package/dist/generators/react/templates/src/main/webapp/app/entities/_entityFolder_/_entityFile_-update.tsx.ejs +12 -13
  153. package/dist/generators/react/templates/src/main/webapp/app/entities/_entityFolder_/_entityFile_.tsx.ejs +3 -8
  154. package/dist/generators/react/templates/src/main/webapp/app/entities/_entityFolder_/_entityModel_.model.ts.ejs +1 -1
  155. package/dist/generators/react/templates/src/main/webapp/app/shared/layout/header/header.scss.ejs +1 -1
  156. package/dist/generators/react/templates/src/main/webapp/app/shared/reducers/reducer.utils.ts.ejs +1 -1
  157. package/dist/generators/react/templates/src/main/webapp/app/shared/util/date-utils.ts.ejs +1 -1
  158. package/dist/generators/server/cleanup.mjs +5 -0
  159. package/dist/generators/server/command.mjs +13 -2
  160. package/dist/generators/server/entity-files.mjs +3 -3
  161. package/dist/generators/server/files.mjs +2 -38
  162. package/dist/generators/server/generator.mjs +35 -19
  163. package/dist/generators/server/jdl/application-definition.mjs +5 -2
  164. package/dist/generators/server/options/feign-client.mjs +24 -0
  165. package/dist/generators/server/options/index.mjs +1 -0
  166. package/dist/generators/server/resources/Dockerfile +16 -16
  167. package/dist/generators/server/resources/gradle/libs.versions.toml +4 -4
  168. package/dist/generators/server/resources/pom.xml +11 -11
  169. package/dist/generators/server/support/config.mjs +1 -0
  170. package/dist/generators/server/support/prepare-entity.mjs +4 -1
  171. package/dist/generators/server/templates/build.gradle.ejs +1 -2
  172. package/dist/generators/server/templates/gradle/profile_dev.gradle.ejs +3 -21
  173. package/dist/generators/server/templates/gradle/profile_prod.gradle.ejs +5 -15
  174. package/dist/generators/server/templates/pom.xml.ejs +1 -4
  175. package/dist/generators/server/templates/src/main/java/_package_/_entityPackage_/_partials_entity_/get_all_template.ejs +7 -7
  176. package/dist/generators/server/templates/src/main/java/_package_/_entityPackage_/_partials_entity_/search_template.ejs +4 -4
  177. package/dist/generators/server/templates/src/main/java/_package_/_entityPackage_/repository/_entityClass_Repository.java.ejs +1 -1
  178. package/dist/generators/server/templates/src/main/java/_package_/_entityPackage_/service/mapper/_entityClass_Mapper.java.ejs +2 -2
  179. package/dist/generators/server/templates/src/main/java/_package_/_entityPackage_/web/rest/_entityClass_Resource.java.ejs +3 -3
  180. package/dist/generators/server/templates/src/main/java/_package_/config/SecurityConfiguration_imperative.java.ejs +20 -2
  181. package/dist/generators/server/templates/src/main/java/_package_/config/SecurityConfiguration_reactive.java.ejs +4 -1
  182. package/dist/generators/server/templates/src/main/java/_package_/security/oauth2/CustomClaimConverter.java.ejs +1 -5
  183. package/dist/generators/server/templates/src/main/java/_package_/service/MailService.java.ejs +48 -12
  184. package/dist/generators/server/templates/src/main/java/_package_/web/rest/AccountResource.java.ejs +1 -1
  185. package/dist/generators/server/templates/src/main/java/_package_/web/rest/LogoutResource_imperative.java.ejs +4 -13
  186. package/dist/generators/server/templates/src/main/java/_package_/web/rest/LogoutResource_reactive.java.ejs +5 -11
  187. package/dist/generators/server/templates/src/main/java/_package_/web/rest/PublicUserResource.java.ejs +3 -3
  188. package/dist/generators/server/templates/src/main/java/_package_/web/rest/UserResource.java.ejs +6 -6
  189. package/dist/generators/server/templates/src/main/resources/config/application.yml.ejs +8 -7
  190. package/dist/generators/server/templates/src/test/java/_package_/TechnicalStructureTest.java.ejs +1 -1
  191. package/dist/generators/server/templates/src/test/java/_package_/_entityPackage_/web/rest/_entityClass_ResourceIT.java.ejs +8 -8
  192. package/dist/generators/server/templates/src/test/java/_package_/web/rest/errors/ExceptionTranslatorTestController.java.ejs +2 -2
  193. package/dist/generators/spring-cache/internal/dependencies.mjs +1 -1
  194. package/dist/generators/spring-cache/templates/gradle/cache.gradle.ejs +1 -1
  195. package/dist/generators/spring-cache/templates/src/main/java/_package_/config/CacheFactoryConfiguration.java.ejs +1 -1
  196. package/dist/generators/spring-cloud-stream/templates/src/main/java/_package_/web/rest/KafkaResource_imperative.java.ejs +1 -1
  197. package/dist/generators/spring-cloud-stream/templates/src/main/java/_package_/web/rest/KafkaResource_reactive.java.ejs +1 -1
  198. package/dist/generators/spring-cloud-stream/templates/src/test/java/_package_/web/rest/KafkaResourceIT_reactive.java.ejs +3 -0
  199. package/dist/generators/spring-data-elasticsearch/templates/src/main/java/_package_/_entityPackage_/domain/_persistClass_.java.jhi.elastic_search.ejs +1 -1
  200. package/dist/generators/spring-data-elasticsearch/templates/src/main/java/_package_/_entityPackage_/repository/search/_entityClass_SearchRepository.java.ejs +1 -1
  201. package/dist/generators/spring-data-elasticsearch/templates/src/main/java/_package_/repository/search/UserSearchRepository.java.ejs +4 -4
  202. package/dist/generators/spring-data-neo4j/generator.mjs +43 -1
  203. package/dist/generators/spring-data-neo4j/templates/src/main/java/_package_/_entityPackage_/domain/_persistClass_.java.jhi.spring_data_neo4j.ejs +1 -1
  204. package/dist/generators/spring-data-relational/README.md +7 -0
  205. package/dist/generators/spring-data-relational/generator.mjs +2 -1
  206. package/dist/generators/spring-data-relational/internal/dependencies.mjs +29 -8
  207. package/dist/generators/spring-data-relational/support/database-data.mjs +4 -0
  208. package/dist/generators/spring-data-relational/templates/src/main/java/_package_/repository/EntityManager_reactive.java.ejs +49 -8
  209. package/dist/generators/spring-data-relational/templates/src/test/java/_package_/config/SqlTestContainersSpringContextCustomizerFactory.java.ejs +1 -1
  210. package/dist/generators/upgrade/generator.mjs +3 -3
  211. package/dist/generators/vue/resources/package.json +21 -21
  212. package/dist/generators/vue/templates/package.json.ejs +1 -0
  213. package/dist/generators/vue/templates/src/main/webapp/app/entities/_entityFolder_/_entityFile_-details.vue.ejs +1 -2
  214. package/dist/generators/vue/templates/src/main/webapp/app/entities/_entityFolder_/_entityFile_-update.component.spec.ts.ejs +1 -1
  215. package/dist/generators/vue/templates/src/main/webapp/app/entities/_entityFolder_/_entityFile_-update.component.ts.ejs +3 -3
  216. package/dist/generators/vue/templates/src/main/webapp/app/entities/_entityFolder_/_entityFile_-update.vue.ejs +2 -15
  217. package/dist/generators/vue/templates/src/main/webapp/app/entities/_entityFolder_/_entityFile_.vue.ejs +2 -7
  218. package/dist/jdl/converters/jdl-to-json/jdl-to-json-basic-entity-converter.js +1 -0
  219. package/dist/jdl/converters/json-to-jdl-converter.js +1 -1
  220. package/dist/jdl/converters/json-to-jdl-entity-converter.js +1 -0
  221. package/dist/jdl/converters/parsed-jdl-to-jdl-object/entity-converter.js +5 -0
  222. package/dist/jdl/converters/parsed-jdl-to-jdl-object/parsed-jdl-to-jdl-object-converter.js +0 -27
  223. package/dist/jdl/exporters/jhipster-entity-exporter.js +3 -2
  224. package/dist/jdl/jhipster/default-application-options.js +1 -1
  225. package/dist/jdl/jhipster/field-types.js +1 -1
  226. package/dist/jdl/jhipster/json-entity.js +6 -0
  227. package/dist/jdl/models/jdl-entity.js +16 -1
  228. package/dist/jdl/models/jdl-field.js +13 -0
  229. package/dist/jdl/models/jdl-object.js +3 -3
  230. package/dist/jdl/models/jdl-relationship.js +23 -5
  231. package/dist/jdl/parsing/lexer/application-tokens.js +1 -1
  232. package/dist/testing/helpers.mjs +10 -3
  233. package/dist/types/cli/environment-builder.d.mts +2 -0
  234. package/dist/types/generators/angular/needle-api/needle-client-angular.d.mts +0 -1
  235. package/dist/types/generators/base/api.d.mts +12 -0
  236. package/dist/types/generators/base/support/needles.d.mts +1 -1
  237. package/dist/types/generators/base-application/generator.d.mts +2 -2
  238. package/dist/types/generators/base-application/support/index.d.mts +1 -0
  239. package/dist/types/generators/base-application/support/update-application-entities-transform.d.mts +4 -0
  240. package/dist/types/generators/base-application/types/relationship.d.mts +4 -0
  241. package/dist/types/generators/base-core/generator.d.mts +7 -1
  242. package/dist/types/generators/bootstrap-application-base/support/export-jdl-transform.d.mts +8 -0
  243. package/dist/types/generators/bootstrap-application-base/support/import-jdl-transform.d.mts +6 -0
  244. package/dist/types/generators/bootstrap-application-base/support/index.d.mts +2 -0
  245. package/dist/types/generators/client/support/entity-definition.d.mts +2 -2
  246. package/dist/types/generators/feign-client/types-export.d.ts +1 -0
  247. package/dist/types/generators/generator-constants.d.mts +52 -48
  248. package/dist/types/generators/generator-list.d.mts +1 -0
  249. package/dist/types/generators/project-name/support/name-resolver.d.mts +9 -1
  250. package/dist/types/generators/server/options/feign-client.d.mts +21 -0
  251. package/dist/types/generators/server/options/index.d.mts +1 -0
  252. package/dist/types/jdl/converters/json-to-jdl-converter.d.ts +1 -0
  253. package/dist/types/jdl/converters/parsed-jdl-to-jdl-object/option-converter.d.ts +1 -1
  254. package/dist/types/jdl/jhipster/json-entity.d.ts +2 -0
  255. package/dist/types/jdl/models/jdl-entity.d.ts +1 -0
  256. package/dist/types/jdl/models/jdl-relationship.d.ts +0 -18
  257. package/dist/types/jdl/types/types.d.mts +2 -2
  258. package/package.json +27 -27
@@ -0,0 +1,67 @@
1
+ <%#
2
+ Copyright 2013-2023 the original author or authors from the JHipster project.
3
+
4
+ This file is part of the JHipster project, see https://www.jhipster.tech/
5
+ for more information.
6
+
7
+ Licensed under the Apache License, Version 2.0 (the "License");
8
+ you may not use this file except in compliance with the License.
9
+ You may obtain a copy of the License at
10
+
11
+ https://www.apache.org/licenses/LICENSE-2.0
12
+
13
+ Unless required by applicable law or agreed to in writing, software
14
+ distributed under the License is distributed on an "AS IS" BASIS,
15
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ See the License for the specific language governing permissions and
17
+ limitations under the License.
18
+ -%>
19
+ import { ApplicationConfig, LOCALE_ID, importProvidersFrom } from '@angular/core';
20
+ import { BrowserModule, Title } from '@angular/platform-browser';
21
+ import { RouterFeatures, TitleStrategy, provideRouter, withComponentInputBinding, withDebugTracing } from '@angular/router';
22
+ import { ServiceWorkerModule } from '@angular/service-worker';
23
+ import { HttpClientModule } from '@angular/common/http';
24
+
25
+ import { NgbDateAdapter } from '@ng-bootstrap/ng-bootstrap';
26
+
27
+ import { DEBUG_INFO_ENABLED } from 'app/app.constants';
28
+ import './config/dayjs';
29
+ <%_ if (enableTranslation) { _%>
30
+ import { TranslationModule } from 'app/shared/language/translation.module';
31
+ <%_ } _%>
32
+ import { httpInterceptorProviders } from 'app/core/interceptor/index';
33
+ import FindLanguageFromKeyPipe from 'app/shared/language/find-language-from-key.pipe';
34
+ import routes from './app.routes';
35
+ // jhipster-needle-angular-add-module-import JHipster will add new module here
36
+ import { NgbDateDayjsAdapter } from './config/datepicker-adapter';
37
+ import { AppPageTitleStrategy } from './app-page-title-strategy';
38
+
39
+ const routerFeatures: Array<RouterFeatures> = [withComponentInputBinding()];
40
+ if (DEBUG_INFO_ENABLED) {
41
+ routerFeatures.push(withDebugTracing());
42
+ }
43
+
44
+ export const appConfig: ApplicationConfig = {
45
+ providers: [
46
+ provideRouter(routes, ...routerFeatures),
47
+ importProvidersFrom(BrowserModule),
48
+ // Set this to true to enable service worker (PWA)
49
+ importProvidersFrom(ServiceWorkerModule.register('ngsw-worker.js', { enabled: false })),
50
+ <%_ if (enableTranslation) { _%>
51
+ importProvidersFrom(TranslationModule),
52
+ <%_ } _%>
53
+ importProvidersFrom(HttpClientModule),
54
+ Title,
55
+ <%_ if (authenticationTypeSession && communicationSpringWebsocket) { _%>
56
+ CookieService,
57
+ <%_ } _%>
58
+ { provide: LOCALE_ID, useValue: '<%= angularLocaleId %>' },
59
+ { provide: NgbDateAdapter, useClass: NgbDateDayjsAdapter },
60
+ <%_ if (enableI18nRTL) { _%>
61
+ FindLanguageFromKeyPipe,
62
+ <%_ } _%>
63
+ httpInterceptorProviders,
64
+ { provide: TitleStrategy, useClass: AppPageTitleStrategy },
65
+ // jhipster-needle-angular-add-module JHipster will add new module here
66
+ ],
67
+ };
@@ -0,0 +1,85 @@
1
+ <%#
2
+ Copyright 2013-2023 the original author or authors from the JHipster project.
3
+
4
+ This file is part of the JHipster project, see https://www.jhipster.tech/
5
+ for more information.
6
+
7
+ Licensed under the Apache License, Version 2.0 (the "License");
8
+ you may not use this file except in compliance with the License.
9
+ You may obtain a copy of the License at
10
+
11
+ https://www.apache.org/licenses/LICENSE-2.0
12
+
13
+ Unless required by applicable law or agreed to in writing, software
14
+ distributed under the License is distributed on an "AS IS" BASIS,
15
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ See the License for the specific language governing permissions and
17
+ limitations under the License.
18
+ -%>
19
+ import { NgModule } from '@angular/core';
20
+ import { Routes } from '@angular/router';
21
+
22
+ import { errorRoute } from './layouts/error/error.route';
23
+ import { Authority } from 'app/config/authority.constants';
24
+
25
+ import HomeComponent from './home/home.component';
26
+ import NavbarComponent from './layouts/navbar/navbar.component';
27
+ <%_ if (!authenticationTypeOauth2) { _%>
28
+ import LoginComponent from './login/login.component';
29
+ <%_ } _%>
30
+ <%_ if (applicationTypeGateway && microfrontend) { _%>
31
+ import { loadEntityRoutes } from './core/microfrontend';
32
+ <%_ } _%>
33
+
34
+ import { UserRouteAccessService } from 'app/core/auth/user-route-access.service';
35
+
36
+ const routes: Routes = [
37
+ {
38
+ path: '',
39
+ component: HomeComponent,
40
+ title: 'home.title',
41
+ },
42
+ {
43
+ path: '',
44
+ component: NavbarComponent,
45
+ outlet: 'navbar',
46
+ },
47
+ <%_ if (!applicationTypeMicroservice) { _%>
48
+ {
49
+ path: 'admin',
50
+ data: {
51
+ authorities: [Authority.ADMIN],
52
+ },
53
+ canActivate: [UserRouteAccessService],
54
+ loadChildren: () => import('./admin/admin.routes'),
55
+ },
56
+ <%_ } _%>
57
+ <%_ if (generateUserManagement) { _%>
58
+ {
59
+ path: 'account',
60
+ loadChildren: () => import('./account/account.route'),
61
+ },
62
+ <%_ } _%>
63
+ <%_ if (!authenticationTypeOauth2) { _%>
64
+ {
65
+ path: 'login',
66
+ component: LoginComponent,
67
+ title: 'login.title',
68
+ },
69
+ <%_ } _%>
70
+ {
71
+ path: '<%= applicationTypeMicroservice ? lowercaseBaseName : '' %>',
72
+ loadChildren: () => import(`./entities/entity.routes`),
73
+ },
74
+ <%_ if (applicationTypeGateway && microfrontend) { _%>
75
+ <%_ for (const remote of microfrontends) { _%>
76
+ {
77
+ path: '<%= remote.lowercaseBaseName %>',
78
+ loadChildren: () => loadEntityRoutes('<%= remote.lowercaseBaseName %>'),
79
+ },
80
+ <%_ } _%>
81
+ <%_ } _%>
82
+ ...errorRoute,
83
+ ];
84
+
85
+ export default routes;
@@ -16,6 +16,7 @@
16
16
  See the License for the specific language governing permissions and
17
17
  limitations under the License.
18
18
  -%>
19
+ // eslint-disable @typescript-eslint/no-unsafe-return
19
20
  import { Type } from '@angular/core';
20
21
  import { loadRemoteModule } from '@angular-architects/module-federation-runtime';
21
22
 
@@ -35,9 +36,9 @@ export const loadTranslationModule = async (service: string): Promise<Type<any>>
35
36
  exposedModule: './translation-module',
36
37
  }).then(({ LazyTranslationModule }) => LazyTranslationModule);
37
38
 
38
- export const loadEntityModule = async (service: string): Promise<Type<any>> =>
39
- loadRemoteModule<{ EntityRoutingModule: Type<any> }>({
39
+ export const loadEntityRoutes = (service: string): Promise<Type<any>> =>
40
+ loadRemoteModule<Type<any>>({
40
41
  type: 'module',
41
42
  remoteEntry: `./services/${service}/remoteEntry.js`,
42
- exposedModule: './entity-routing',
43
- }).then(({ EntityRoutingModule }) => EntityRoutingModule);
43
+ exposedModule: './entity-routes',
44
+ });
@@ -296,7 +296,7 @@ describe('Alert service test', () => {
296
296
  }
297
297
  ));
298
298
 
299
- it('should produce a info message with provided key if transltion key does not exist in translations and message is not provided', inject(
299
+ it('should produce a info message with provided key if translation key does not exist in translations and message is not provided', inject(
300
300
  [AlertService, TranslateService],
301
301
  (service: AlertService) => {
302
302
  expect(service.addAlert({ type: 'info', translationKey: 'hello.jhipster' })).toEqual(
@@ -48,7 +48,7 @@ export class DataUtils {
48
48
  */
49
49
  openFile(data: string, contentType: string | null | undefined): void {
50
50
  contentType = contentType ?? '';
51
-
51
+
52
52
  const byteCharacters = Buffer.from(data, 'base64').toString('binary');
53
53
  const byteNumbers = new Array(byteCharacters.length);
54
54
  for (let i = 0; i < byteCharacters.length; i++) {
@@ -73,7 +73,7 @@ export class DataUtils {
73
73
  * @param editForm the form group where the input field is located
74
74
  * @param field the field name to set the file's 'base 64 data' on
75
75
  * @param isImage boolean representing if the file represented by the event is an image
76
- * @returns an observable that loads file to form field and completes if sussessful
76
+ * @returns an observable that loads file to form field and completes if successful
77
77
  * or returns error as FileLoadError on failure
78
78
  */
79
79
  loadFileToForm(event: Event, editForm: FormGroup, field: string, isImage: boolean): Observable<void> {
@@ -32,13 +32,13 @@ describe('Event Manager tests', () => {
32
32
  });
33
33
 
34
34
  describe('EventManager', () => {
35
- let recievedEvent: EventWithContent<unknown> | string | null;
35
+ let receivedEvent: EventWithContent<unknown> | string | null;
36
36
 
37
37
  beforeEach(() => {
38
38
  TestBed.configureTestingModule({
39
39
  providers: [EventManager],
40
40
  });
41
- recievedEvent = null;
41
+ receivedEvent = null;
42
42
  });
43
43
 
44
44
  it('should not fail when nosubscriber and broadcasting', inject([EventManager], (eventManager: EventManager) => {
@@ -50,53 +50,53 @@ describe('Event Manager tests', () => {
50
50
  [EventManager],
51
51
  (eventManager: EventManager) => {
52
52
  // GIVEN
53
- eventManager.subscribe('modifier', (event: EventWithContent<unknown> | string) => (recievedEvent = event));
53
+ eventManager.subscribe('modifier', (event: EventWithContent<unknown> | string) => (receivedEvent = event));
54
54
 
55
55
  // WHEN
56
56
  eventManager.broadcast({ name: 'unrelatedModifier', content: 'unrelated modification' });
57
57
  // THEN
58
- expect(recievedEvent).toBeNull();
58
+ expect(receivedEvent).toBeNull();
59
59
 
60
60
  // WHEN
61
61
  eventManager.broadcast({ name: 'modifier', content: 'modified something' });
62
62
  // THEN
63
- expect(recievedEvent).toEqual({ name: 'modifier', content: 'modified something' });
63
+ expect(receivedEvent).toEqual({ name: 'modifier', content: 'modified something' });
64
64
  }
65
65
  ));
66
66
 
67
67
  it('should create an observable and callback when broadcasted string', inject([EventManager], (eventManager: EventManager) => {
68
68
  // GIVEN
69
- eventManager.subscribe('modifier', (event: EventWithContent<unknown> | string) => (recievedEvent = event));
69
+ eventManager.subscribe('modifier', (event: EventWithContent<unknown> | string) => (receivedEvent = event));
70
70
 
71
71
  // WHEN
72
72
  eventManager.broadcast('unrelatedModifier');
73
73
  // THEN
74
- expect(recievedEvent).toBeNull();
74
+ expect(receivedEvent).toBeNull();
75
75
 
76
76
  // WHEN
77
77
  eventManager.broadcast('modifier');
78
78
  // THEN
79
- expect(recievedEvent).toEqual('modifier');
79
+ expect(receivedEvent).toEqual('modifier');
80
80
  }));
81
81
 
82
82
  it('should subscribe to multiple events', inject([EventManager], (eventManager: EventManager) => {
83
83
  // GIVEN
84
- eventManager.subscribe(['modifier', 'modifier2'], (event: EventWithContent<unknown> | string) => (recievedEvent = event));
84
+ eventManager.subscribe(['modifier', 'modifier2'], (event: EventWithContent<unknown> | string) => (receivedEvent = event));
85
85
 
86
86
  // WHEN
87
87
  eventManager.broadcast('unrelatedModifier');
88
88
  // THEN
89
- expect(recievedEvent).toBeNull();
89
+ expect(receivedEvent).toBeNull();
90
90
 
91
91
  // WHEN
92
92
  eventManager.broadcast({ name: 'modifier', content: 'modified something' });
93
93
  // THEN
94
- expect(recievedEvent).toEqual({ name: 'modifier', content: 'modified something' });
94
+ expect(receivedEvent).toEqual({ name: 'modifier', content: 'modified something' });
95
95
 
96
96
  // WHEN
97
97
  eventManager.broadcast('modifier2');
98
98
  // THEN
99
- expect(recievedEvent).toEqual('modifier2');
99
+ expect(receivedEvent).toEqual('modifier2');
100
100
  }));
101
101
  });
102
102
  });
@@ -22,7 +22,7 @@ const enumImports = this.generateEntityClientEnumImports(fields);
22
22
  <%_ if (anyFieldIsDateDerived) { _%>
23
23
  import dayjs from 'dayjs/esm';
24
24
  <%_ } _%>
25
- <%_ for (const relationshipsByType of Object.values(differentRelationships).filter(relationshipsByType => relationshipsByType.some(relationship => (relationship.ownerSide || relationship.relationshipManyToMany) && relationship.otherEntity.entityAngularName !== entityAngularName))) {
25
+ <%_ for (const relationshipsByType of Object.values(differentRelationships).filter(relationshipsByType => relationshipsByType.some(relationship => relationship.otherEntity.entityAngularName !== entityAngularName))) {
26
26
  const { otherEntity } = relationshipsByType[0];
27
27
  _%>
28
28
  import { I<%- otherEntity.entityAngularName %> } from 'app/entities/<%= otherEntity.entityClientRootFolder %><%= otherEntity.entityFolderName %>/<%= otherEntity.entityFileName %>.model';
@@ -41,10 +41,10 @@ _%>
41
41
  <%= fieldName %>ContentType<% if (!id /* && !fieldValidationRequired */) { %>?<% } %>: string<% if (!id /* && !fieldValidationRequired */) { %> | null<% } %>,
42
42
  <%_ } _%>
43
43
  <%_ } _%>
44
- <%_ for (const relationship of relationships.filter(relationship => relationship.ownerSide || relationship.relationshipManyToMany)) {
45
- const { propertyName, relationshipRequired, otherEntity, id, collection, otherEntityField } = relationship;
44
+ <%_ for (const relationship of relationships) {
45
+ const { propertyName, relationshipRequired, otherEntity, collection, otherEntityField } = relationship;
46
46
  _%>
47
- <%= propertyName %>?: Pick<I<%= otherEntity.entityAngularName %>, '<%= otherEntity.primaryKey.name %>'<% if (otherEntity.primaryKey.name !== otherEntityField) { %> | '<%= otherEntityField %>'<% } %>><% if (collection) { %>[]<% } %> | null;
47
+ <%= propertyName %>?: <% if (!otherEntity.embedded && (dtoMapstruct || otherEntity.builtInUser)) { %>Pick<<% } %>I<%= otherEntity.entityAngularName %><% if (!otherEntity.embedded && (dtoMapstruct || otherEntity.builtInUser)) { %>, '<%= otherEntity.primaryKey.name %>'<% if (otherEntity.primaryKey.name !== otherEntityField) { %> | '<%= otherEntityField %>'<% } %>><% } %><% if (collection) { %>[]<% } %> | null;
48
48
  <%_ } _%>
49
49
  }
50
50
  <%_ if (primaryKey) { _%>
@@ -16,7 +16,8 @@
16
16
  See the License for the specific language governing permissions and
17
17
  limitations under the License.
18
18
  -%>
19
- <form *ngIf="<%= entityInstance %>" name="deleteForm" (ngSubmit)="confirmDelete(<%= entityInstance %>.<%= primaryKey.name %>!)">
19
+ @if (<%= entityInstance %>) {
20
+ <form name="deleteForm" (ngSubmit)="confirmDelete(<%= entityInstance %>.<%= primaryKey.name %>!)">
20
21
  <div class="modal-header">
21
22
  <h4 class="modal-title" data-cy="<%= entityInstance %>DeleteDialogHeading" <%= jhiPrefix %>Translate="entity.delete.title">__jhiTransformTranslate__('entity.delete.title')</h4>
22
23
 
@@ -39,3 +40,4 @@
39
40
  </button>
40
41
  </div>
41
42
  </form>
43
+ }
@@ -18,7 +18,8 @@
18
18
  -%>
19
19
  <div class="d-flex justify-content-center">
20
20
  <div class="col-8">
21
- <div *ngIf="<%= entityInstance %>">
21
+ @if (<%= entityInstance %>) {
22
+ <div>
22
23
  <h2 data-cy="<%= entityInstance %>DetailsHeading"><span <%= jhiPrefix %>Translate="<%= i18nKeyPrefix %>.detail.title">__jhiTransformTranslate__('<%- i18nKeyPrefix %>.detail.title')</span></h2>
23
24
 
24
25
  <hr>
@@ -38,17 +39,21 @@ _%>
38
39
  <%# TODO: import enum and use its key as label _%>
39
40
  <span <%= jhiPrefix %>Translate="{{ '<%= frontendAppName %>.<%= fieldType %>.' + <%= entityInstance %>.<%= fieldName %> }}">{{ <%= entityInstance %>.<%= fieldName %> }}</span>
40
41
  <%_ } else if (field.fieldTypeBinary && field.blobContentTypeImage) { _%>
41
- <div *ngIf="<%= entityInstance %>.<%= fieldName %>">
42
- <a (click)="openFile(<%= entityInstance %>.<%= fieldName %>, <%= entityInstance %>.<%= fieldName %>ContentType)">
43
- <img [src]="'data:' + <%= entityInstance %>.<%= fieldName %>ContentType + ';base64,' + <%= entityInstance %>.<%= fieldName %>" style="max-width: 100%;" alt="<%= entityInstance %> image"/>
44
- </a>
45
- {{ <%= entityInstance %>.<%= fieldName %>ContentType }}, {{ byteSize(<%= entityInstance %>.<%= fieldName %>) }}
42
+ @if (<%= entityInstance %>.<%= fieldName %>) {
43
+ <div>
44
+ <a (click)="openFile(<%= entityInstance %>.<%= fieldName %>, <%= entityInstance %>.<%= fieldName %>ContentType)">
45
+ <img [src]="'data:' + <%= entityInstance %>.<%= fieldName %>ContentType + ';base64,' + <%= entityInstance %>.<%= fieldName %>" style="max-width: 100%;" alt="<%= entityInstance %> image"/>
46
+ </a>
47
+ {{ <%= entityInstance %>.<%= fieldName %>ContentType }}, {{ byteSize(<%= entityInstance %>.<%= fieldName %>) }}
46
48
  </div>
49
+ }
47
50
  <%_ } else if (field.fieldTypeBinary && field.blobContentTypeAny) { _%>
48
- <div *ngIf="<%= entityInstance %>.<%= fieldName %>">
49
- <a (click)="openFile(<%= entityInstance %>.<%= fieldName %>, <%= entityInstance %>.<%= fieldName %>ContentType)" <%= jhiPrefix %>Translate="entity.action.open">__jhiTransformTranslate__('entity.action.open')</a>
50
- {{ <%= entityInstance %>.<%= fieldName %>ContentType }}, {{ byteSize(<%= entityInstance %>.<%= fieldName %>) }}
51
+ @if (<%= entityInstance %>.<%= fieldName %>) {
52
+ <div>
53
+ <a (click)="openFile(<%= entityInstance %>.<%= fieldName %>, <%= entityInstance %>.<%= fieldName %>ContentType)" <%= jhiPrefix %>Translate="entity.action.open">__jhiTransformTranslate__('entity.action.open')</a>
54
+ {{ <%= entityInstance %>.<%= fieldName %>ContentType }}, {{ byteSize(<%= entityInstance %>.<%= fieldName %>) }}
51
55
  </div>
56
+ }
52
57
  <%_ } else if (field.fieldTypeDuration) { _%>
53
58
  <span>{{ <%= entityInstance %>.<%= fieldName %> | duration }} ({{<%= entityInstance %>.<%= fieldName %> }})</span>
54
59
  <%_ } else if (field.fieldTypeTimed) { _%>
@@ -62,34 +67,40 @@ _%>
62
67
  <%_ } _%>
63
68
  <%_
64
69
  for (const relationship of relationships.filter(rel => !rel.otherEntityIsEmbedded)) {
65
- const ownerSide = relationship.ownerSide;
70
+ const { persistableRelationship } = relationship;
66
71
  const relationshipName = relationship.relationshipName;
67
72
  const relationshipFieldName = relationship.relationshipFieldName;
68
73
  const relationshipFieldNamePlural = relationship.relationshipFieldNamePlural;
69
74
  const relationshipNameHumanized = relationship.relationshipNameHumanized;
70
75
  const otherEntityStateName = relationship.otherEntityStateName;
71
76
  const otherEntityField = relationship.otherEntityField;
72
- if (ownerSide) {
77
+ if (persistableRelationship) {
73
78
  _%>
74
79
  <dt><span <%= jhiPrefix %>Translate="<%= i18nKeyPrefix %>.<%= relationshipName %>">__jhiTransformTranslate__('<%- i18nKeyPrefix %>.<%- relationshipName %>')</span></dt>
75
80
  <dd>
76
81
  <%_ if (relationship.otherEntityUser) { _%>
77
82
  <%_ if (relationship.collection) { _%>
78
- <span *ngFor="let <%= relationshipFieldName %> of <%= entityInstance %>.<%= relationshipFieldNamePlural %>; let last = last">
83
+ @for (<%= relationshipFieldName %> of <%= entityInstance %>.<%= relationshipFieldNamePlural %>; track $index; let last = $last) {
84
+ <span>
79
85
  {{ <%= relationshipFieldName %>.<%= otherEntityField %> }}{{ last ? '' : ', ' }}
80
86
  </span>
87
+ }
81
88
  <%_ } else { _%>
82
89
  <span>{{ <%= entityInstance %>.<%= relationshipFieldName %>?.<%= otherEntityField %> }}</span>
83
90
  <%_ } _%>
84
91
  <%_ } else { _%>
85
92
  <%_ if (relationship.collection) { _%>
86
- <span *ngFor="let <%= relationshipFieldName %> of <%= entityInstance %>.<%= relationshipFieldNamePlural %>; let last = last">
93
+ @for (<%= relationshipFieldName %> of <%= entityInstance %>.<%= relationshipFieldNamePlural %>; track $index; let last = $last) {
94
+ <span>
87
95
  <a [routerLink]="['/<%= otherEntityStateName %>', <%= relationshipFieldName %>.<%= relationship.otherEntity.primaryKey.name %>, 'view']">{{ <%= relationshipFieldName %>.<%= otherEntityField %> }}</a>{{ last ? '' : ', ' }}
88
96
  </span>
97
+ }
89
98
  <%_ } else { _%>
90
- <div *ngIf="<%= entityInstance + '.' + relationshipFieldName %>">
99
+ @if (<%= entityInstance + '.' + relationshipFieldName %>) {
100
+ <div>
91
101
  <a [routerLink]="['/<%= otherEntityStateName %>', <%= entityInstance + '.' + relationshipFieldName + '.' + relationship.otherEntity.primaryKey.name %>, 'view']">{{ <%= entityInstance %>.<%= relationshipFieldName %>.<%= otherEntityField %> }}</a>
92
102
  </div>
103
+ }
93
104
  <%_ } _%>
94
105
  <%_ } _%>
95
106
  </dd>
@@ -114,5 +125,6 @@ _%>
114
125
  </button>
115
126
  <%_ } _%>
116
127
  </div>
128
+ }
117
129
  </div>
118
130
  </div>
@@ -50,9 +50,11 @@
50
50
  <fa-icon icon="search"></fa-icon>
51
51
  </button>
52
52
 
53
- <button class="btn btn-danger" (click)="search('')" *ngIf="currentSearch">
53
+ @if (currentSearch) {
54
+ <button class="btn btn-danger" (click)="search('')">
54
55
  <fa-icon icon="trash-alt"></fa-icon>
55
56
  </button>
57
+ }
56
58
  </div>
57
59
  </div>
58
60
  </form>
@@ -62,11 +64,14 @@
62
64
  <<%= jhiPrefixDashed %>-filter [filters]="filters"></<%= jhiPrefixDashed %>-filter>
63
65
  <%_ } _%>
64
66
 
65
- <div class="alert alert-warning" id="no-result" *ngIf="<%= entityInstancePlural %>?.length === 0">
67
+ @if (<%= entityInstancePlural %>?.length === 0) {
68
+ <div class="alert alert-warning" id="no-result">
66
69
  <span <%= jhiPrefix %>Translate="<%= i18nKeyPrefix %>.home.notFound">__jhiTransformTranslate__('<%- i18nKeyPrefix %>.home.notFound')</span>
67
70
  </div>
71
+ }
68
72
 
69
- <div class="table-responsive table-entities" id="entities" *ngIf="<%= entityInstancePlural %> && <%= entityInstancePlural %>.length > 0">
73
+ @if (<%= entityInstancePlural %> && <%= entityInstancePlural %>.length > 0) {
74
+ <div class="table-responsive table-entities" id="entities">
70
75
  <table class="table table-striped" aria-describedby="page-heading">
71
76
  <thead>
72
77
  <tr <%= jhiPrefix %>Sort [(predicate)]="predicate" [(ascending)]="ascending" (sortChange)="navigateToWithComponentValues()">
@@ -75,15 +80,15 @@
75
80
  <div class="d-flex">
76
81
  <span <%= jhiPrefix %>Translate="<%= field.fieldTranslationKey %>">__jhiTransformTranslate__('<%- field.fieldTranslationKey %>')</span>
77
82
  <%_ if (!field.transient) { _%>
78
- <fa-icon class="p-1" <% if (searchEngineAny && !field.fieldTypeBoolean && !field.fieldTypeNumeric && !field.fieldTypeTemporal) { %>*ngIf="!currentSearch" <% } %>icon="sort"></fa-icon>
83
+ <% if (searchEngineAny && !field.fieldTypeBoolean && !field.fieldTypeNumeric && !field.fieldTypeTemporal) { %>@if (!currentSearch) {<% } %>
84
+ <fa-icon class="p-1" icon="sort"></fa-icon>
85
+ <% if (searchEngineAny && !field.fieldTypeBoolean && !field.fieldTypeNumeric && !field.fieldTypeTemporal) { %>}<% } %>
79
86
  <%_ } _%>
80
87
  </div>
81
88
  </th>
82
89
  <%_ } _%>
83
90
  <%_ for (const relationship of relationships.filter(rel => !rel.otherEntityIsEmbedded)) { _%>
84
- <%_ if (relationship.relationshipManyToOne
85
- || (relationship.relationshipOneToOne && relationship.ownerSide)
86
- || (relationship.relationshipManyToMany && relationship.ownerSide && paginationNo)) {
91
+ <%_ if (relationship.persistableRelationship && (!relationship.collection || paginationNo)) {
87
92
  const fieldName = "." + relationship.otherEntityField;
88
93
  _%>
89
94
  <th scope="col" <%= jhiPrefix %>SortBy="<%= relationship.relationshipName + (fieldName) %>">
@@ -98,7 +103,8 @@
98
103
  </tr>
99
104
  </thead>
100
105
  <tbody<% if (paginationInfiniteScroll) { %> infinite-scroll (scrolled)="loadPage(page + 1)" [infiniteScrollDisabled]="page - 1 >= links['last']" [infiniteScrollDistance]="0"<% } %>>
101
- <tr *ngFor="let <%= entityInstance %> of <%= entityInstancePlural %>; trackBy: track<%= primaryKey.nameCapitalized %>" data-cy="entityTable">
106
+ @for (<%= entityInstance %> of <%= entityInstancePlural %>; track track<%= primaryKey.nameCapitalized %>) {
107
+ <tr data-cy="entityTable">
102
108
  <%_
103
109
  const routerLink = ` [routerLink]="['/${ entityPage }', ${entityInstance}.${primaryKey.name}, 'view']"`;
104
110
  for (field of fields.filter(field => !field.hidden)) {
@@ -107,15 +113,19 @@ for (field of fields.filter(field => !field.hidden)) {
107
113
  _%>
108
114
  <%_ if (field.fieldTypeBinary && field.blobContentTypeImage) { _%>
109
115
  <td>
110
- <a *ngIf="<%= entityInstance %>.<%= fieldName %>" (click)="openFile(<%= entityInstance %>.<%= fieldName %>, <%= entityInstance %>.<%= fieldName %>ContentType)">
116
+ @if (<%= entityInstance %>.<%= fieldName %>) {
117
+ <a (click)="openFile(<%= entityInstance %>.<%= fieldName %>, <%= entityInstance %>.<%= fieldName %>ContentType)">
111
118
  <img [src]="'data:' + <%= entityInstance %>.<%= fieldName %>ContentType + ';base64,' + <%= entityInstance %>.<%= fieldName %>" style="max-height: 30px;" alt="<%= entityInstance %> image"/>
112
119
  </a>
113
- <span *ngIf="<%= entityInstance %>.<%= fieldName %>">{{ <%= entityInstance %>.<%= fieldName %>ContentType }}, {{ byteSize(<%= entityInstance %>.<%= fieldName %>) }}</span>
120
+ <span>{{ <%= entityInstance %>.<%= fieldName %>ContentType }}, {{ byteSize(<%= entityInstance %>.<%= fieldName %>) }}</span>
121
+ }
114
122
  </td>
115
123
  <%_ } else if (field.fieldTypeBinary && field.blobContentTypeAny) { _%>
116
124
  <td>
117
- <a *ngIf="<%= entityInstance %>.<%= fieldName %>" (click)="openFile(<%= entityInstance %>.<%= fieldName %>, <%= entityInstance %>.<%= fieldName %>ContentType)" <%= jhiPrefix %>Translate="entity.action.open">__jhiTransformTranslate__('entity.action.open')</a>
118
- <span *ngIf="<%= entityInstance %>.<%= fieldName %>">{{ <%= entityInstance %>.<%= fieldName %>ContentType }}, {{ byteSize(<%= entityInstance %>.<%= fieldName %>) }}</span>
125
+ @if (<%= entityInstance %>.<%= fieldName %>) {
126
+ <a (click)="openFile(<%= entityInstance %>.<%= fieldName %>, <%= entityInstance %>.<%= fieldName %>ContentType)" <%= jhiPrefix %>Translate="entity.action.open">__jhiTransformTranslate__('entity.action.open')</a>
127
+ <span>{{ <%= entityInstance %>.<%= fieldName %>ContentType }}, {{ byteSize(<%= entityInstance %>.<%= fieldName %>) }}</span>
128
+ }
119
129
  </td>
120
130
  <%_ } else if (field.fieldIsEnum) { _%>
121
131
  <%# TODO: import enum and use its key as label _%>
@@ -131,33 +141,33 @@ _%>
131
141
  <%_ } _%>
132
142
  <%_ } _%>
133
143
  <%_ for (const relationship of relationships.filter(rel => !rel.otherEntityIsEmbedded)) {
134
- const ownerSide = relationship.ownerSide;
135
144
  const relationshipFieldName = relationship.relationshipFieldName;
136
145
  const relationshipFieldNamePlural = relationship.relationshipFieldNamePlural;
137
146
  const otherEntityField = relationship.otherEntityField;
138
147
  _%>
139
- <%_ if (relationship.relationshipManyToOne
140
- || (relationship.relationshipOneToOne && ownerSide)
141
- || (relationship.relationshipManyToMany && ownerSide && paginationNo)) {
142
- _%>
148
+ <%_ if (relationship.persistableRelationship && (!relationship.collection || paginationNo)) { _%>
143
149
  <td>
144
150
  <%_ if (relationship.otherEntityUser) { _%>
145
151
  <%_ if (relationship.collection) { _%>
146
- <span *ngFor="let <%= relationshipFieldName %> of <%= entityInstance %>.<%= relationshipFieldNamePlural %>; let last = last">
147
- {{ <%= relationshipFieldName %>.<%= otherEntityField %> }}{{ last ? '' : ', ' }}
148
- </span>
152
+ @for (<%= relationshipFieldName %> of <%= entityInstance %>.<%= relationshipFieldNamePlural %>; track $index; let last = $last) {
153
+ <span>{{ <%= relationshipFieldName %>.<%= otherEntityField %> }}{{ last ? '' : ', ' }}</span>
154
+ }
149
155
  <%_ } else { _%>
150
156
  {{ <%= entityInstance %>.<%= relationshipFieldName %>?.<%= otherEntityField %> }}
151
157
  <%_ } _%>
152
158
  <%_ } else { _%>
153
159
  <%_ if (relationship.collection) { _%>
154
- <span *ngFor="let <%= relationshipFieldName %> of <%= entityInstance %>.<%= relationshipFieldNamePlural %>; let last = last">
160
+ @for (<%= relationshipFieldName %> of <%= entityInstance %>.<%= relationshipFieldNamePlural %>; track $index; let last = $last) {
161
+ <span>
155
162
  <a class="form-control-static" [routerLink]="['/<%= relationship.otherEntity.entityPage %>', <%= relationshipFieldName %>.<%= relationship.otherEntity.primaryKey.name %>, 'view']">{{ <%= relationshipFieldName %>.<%= otherEntityField %> }}</a>{{ last ? '' : ', ' }}
156
163
  </span>
164
+ }
157
165
  <%_ } else { _%>
158
- <div *ngIf="<%= entityInstance + "." + relationshipFieldName %>">
166
+ @if (<%= entityInstance + "." + relationshipFieldName %>) {
167
+ <div>
159
168
  <a [routerLink]="['/<%= relationship.otherEntity.entityPage %>', <%= entityInstance %>.<%= relationshipFieldName %>.<%= relationship.otherEntity.primaryKey.name %>, 'view']">{{ <%= entityInstance %>.<%= relationshipFieldName %>.<%= otherEntityField %> }}</a>
160
169
  </div>
170
+ }
161
171
  <%_ } _%>
162
172
  <%_ } _%>
163
173
  </td>
@@ -166,7 +176,7 @@ _%>
166
176
  <td class="text-end">
167
177
  <div class="btn-group">
168
178
  <%_ for (const relationship of relationships.filter(rel => !rel.otherEntityIsEmbedded)) { _%>
169
- <%_ if (relationship.otherEntity.jpaMetamodelFiltering && relationship.otherEntity.paginationPagination && (relationship.relationshipOneToMany || relationship.relationshipManyToMany) && !relationship.ownerSide) {
179
+ <%_ if (relationship.otherEntity.jpaMetamodelFiltering && relationship.otherEntity.paginationPagination && relationship.collection && !relationship.persistableRelationship) {
170
180
  const otherEntityTranslationKey = i18nKeyPrefix + '.' + relationship.relationshipName;
171
181
  _%>
172
182
  <button type="submit"
@@ -202,12 +212,14 @@ _%>
202
212
  </div>
203
213
  </td>
204
214
  </tr>
215
+ }
205
216
  </tbody>
206
217
  </table>
207
218
  </div>
219
+ }
208
220
  <%_ if (paginationPagination) { _%>
209
-
210
- <div *ngIf="<%= entityInstancePlural %> && <%= entityInstancePlural %>.length > 0">
221
+ @if (<%= entityInstancePlural %> && <%= entityInstancePlural %>.length > 0) {
222
+ <div>
211
223
  <div class="d-flex justify-content-center">
212
224
  <<%= jhiPrefixDashed %>-item-count [params]="{ page: page, totalItems: totalItems, itemsPerPage: itemsPerPage }"></<%= jhiPrefixDashed %>-item-count>
213
225
  </div>
@@ -216,5 +228,6 @@ _%>
216
228
  <ngb-pagination [collectionSize]="totalItems" [page]="page" [pageSize]="itemsPerPage" [maxSize]="5" [rotate]="true" [boundaryLinks]="true" (pageChange)="navigateToPage($event)"></ngb-pagination>
217
229
  </div>
218
230
  </div>
231
+ }
219
232
  <%_ } _%>
220
233
  </div>
@@ -299,7 +299,7 @@ export class <%= componentName %> implements OnInit {
299
299
  <%_ } _%>
300
300
  protected fillComponentAttributesFromResponseBody(data: I<%= entityAngularName %>[] | null): I<%= entityAngularName %>[] {
301
301
  <%_ if (paginationInfiniteScroll) { _%>
302
- // If there is previus link, data is a infinite scroll pagination content.
302
+ // If there is previous link, data is a infinite scroll pagination content.
303
303
  if ('prev' in this.links) {
304
304
  const <%= entityInstancePlural %>New = this.<%= entityInstancePlural %> ?? [];
305
305
  if (data) {
@@ -40,7 +40,7 @@ describe('<%= entityAngularName %> Form Service', () => {
40
40
  <%_ for (const field of fields) { _%>
41
41
  <%= field.fieldName %>: expect.any(Object),
42
42
  <%_ } _%>
43
- <%_ for (const relationship of relationships.filter(relationship => relationship.ownerSide || relationship.relationshipManyToMany)) { _%>
43
+ <%_ for (const relationship of relationships.filter(relationship => relationship.persistableRelationship)) { _%>
44
44
  <%= relationship.propertyName %>: expect.any(Object),
45
45
  <%_ } _%>
46
46
  })
@@ -54,7 +54,7 @@ describe('<%= entityAngularName %> Form Service', () => {
54
54
  <%_ for (const field of fields) { _%>
55
55
  <%= field.fieldName %>: expect.any(Object),
56
56
  <%_ } _%>
57
- <%_ for (const relationship of relationships.filter(relationship => relationship.ownerSide || relationship.relationshipManyToMany)) { _%>
57
+ <%_ for (const relationship of relationships.filter(relationship => relationship.persistableRelationship)) { _%>
58
58
  <%= relationship.propertyName %>: expect.any(Object),
59
59
  <%_ } _%>
60
60
  }));