diff --git a/app/src/main/java/it/chalmers/gamma/adapter/primary/web/ApiKeyController.java b/app/src/main/java/it/chalmers/gamma/adapter/primary/web/ApiKeyController.java index d07457114..a79f50a1b 100644 --- a/app/src/main/java/it/chalmers/gamma/adapter/primary/web/ApiKeyController.java +++ b/app/src/main/java/it/chalmers/gamma/adapter/primary/web/ApiKeyController.java @@ -66,10 +66,10 @@ private ModelAndView createGetApiKey( ModelAndView mv = new ModelAndView(); if (htmxRequest) { - mv.setViewName("pages/api-key-details"); + mv.setViewName("api-key-details/page"); } else { mv.setViewName("index"); - mv.addObject("page", "pages/api-key-details"); + mv.addObject("page", "api-key-details/page"); } mv.addObject("apiKey", apiKey); @@ -96,7 +96,7 @@ private void loadApiKeySettingsInfo(ModelAndView mv, UUID apiKeyId) { "settings_description", "Set the super group types from which the information will be query from"); mv.addObject( - "settings_form", new ApiKeySettingsForm(settings.version(), settings.superGroupTypes())); + "settings_form", new InfoApiKeySettings(settings.version(), settings.superGroupTypes())); } private void loadApiKeySettingsAccountScaffold(ModelAndView mv, UUID apiKeyId) { @@ -107,13 +107,20 @@ private void loadApiKeySettingsAccountScaffold(ModelAndView mv, UUID apiKeyId) { "settings_description", "Set the super group types from which the information will query from"); mv.addObject( - "settings_form", new ApiKeySettingsForm(settings.version(), settings.superGroupTypes())); + "settings_form", + new AccountScaffoldApiKeySettings( + settings.version(), + settings.superGroupTypes().stream() + .map( + type -> + new AccountScaffoldType(type.type(), type.requiresManaged() ? "on" : "off")) + .toList())); } private ModelAndView createApiKeyNotFound(String apiKeyId, boolean htmxRequest) { ModelAndView mv = new ModelAndView(); if (htmxRequest) { - mv.setViewName("pages/api-key-not-found"); + mv.setViewName("api-key-details/not-found"); } else { mv.setViewName("index"); mv.addObject("page", "pages/api-key-not-found"); @@ -124,8 +131,6 @@ private ModelAndView createApiKeyNotFound(String apiKeyId, boolean htmxRequest) return mv; } - public record ApiKeySettingsForm(int version, List superGroupTypes) {} - @GetMapping("/api-keys/{id}") public ModelAndView getApiKey( @RequestHeader(value = "HX-Request", required = false) boolean htmxRequest, @@ -212,10 +217,73 @@ public ModelAndView deleteApiKey( return new ModelAndView("common/empty"); } - public static final class ApiKeySettings { + public static class AccountScaffoldType { + public String type; + public String requiresManaged; + + public AccountScaffoldType() {} + + public AccountScaffoldType(String type, String requiresManaged) { + this.type = type; + this.requiresManaged = requiresManaged; + } + + public String getRequiresManaged() { + return requiresManaged; + } + + public void setRequiresManaged(String requiresManaged) { + this.requiresManaged = requiresManaged; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + } + + public static final class AccountScaffoldApiKeySettings { + public List superGroupTypes = new ArrayList<>(); + public int version; + + public AccountScaffoldApiKeySettings() {} + + public AccountScaffoldApiKeySettings(int version, List types) { + this.version = version; + this.superGroupTypes = types; + } + + public List getSuperGroupTypes() { + return superGroupTypes; + } + + public void setSuperGroupTypes(List superGroupTypes) { + this.superGroupTypes = superGroupTypes; + } + + public int getVersion() { + return version; + } + + public void setVersion(int version) { + this.version = version; + } + } + + public static final class InfoApiKeySettings { public List superGroupTypes = new ArrayList<>(); public int version; + public InfoApiKeySettings() {} + + public InfoApiKeySettings(int version, List types) { + this.version = version; + this.superGroupTypes = types; + } + public List getSuperGroupTypes() { return superGroupTypes; } @@ -233,12 +301,27 @@ public void setVersion(int version) { } } - @GetMapping("/api-keys/new-super-group") - public ModelAndView getNewSuperGroupType( + @GetMapping("/api-keys/new-super-group-type/info") + public ModelAndView getNewSuperGroupTypeInfo( + @RequestHeader(value = "HX-Request", required = true) boolean htmxRequest) { + ModelAndView mv = new ModelAndView(); + + mv.setViewName("api-key-details/new-type-to-info-settings"); + mv.addObject( + "superGroupTypes", + this.superGroupFacade.getAllTypes().stream() + .sorted(Comparator.comparing(String::toLowerCase)) + .toList()); + + return mv; + } + + @GetMapping("/api-keys/new-super-group-type/account-scaffold") + public ModelAndView getNewSuperGroupTypeAccountScaffold( @RequestHeader(value = "HX-Request", required = true) boolean htmxRequest) { ModelAndView mv = new ModelAndView(); - mv.setViewName("partial/new-super-group-type-to-api-settings"); + mv.setViewName("api-key-details/new-type-to-account-scaffold-settings"); mv.addObject( "superGroupTypes", this.superGroupFacade.getAllTypes().stream() @@ -248,11 +331,11 @@ public ModelAndView getNewSuperGroupType( return mv; } - @PutMapping("/api-keys/{apiKeyId}/settings") - public ModelAndView updateSettings( + @PutMapping("/api-keys/{apiKeyId}/account-scaffold-settings") + public ModelAndView updateAccountScaffoldSettings( @RequestHeader(value = "HX-Request", required = false) boolean htmxRequest, @PathVariable("apiKeyId") UUID apiKeyId, - ApiKeySettings form) { + AccountScaffoldApiKeySettings form) { Optional apiKeyMaybe = this.apiKeyFacade.getById(apiKeyId); @@ -262,23 +345,49 @@ public ModelAndView updateSettings( ApiKeyFacade.ApiKeyDTO apiKey = apiKeyMaybe.get(); - ModelAndView mv = new ModelAndView("partial/api-key-super-group-types"); + ModelAndView mv = new ModelAndView("api-key-details/account-scaffold-settings"); - if (apiKey.keyType().equals("ACCOUNT_SCAFFOLD")) { - this.apiKeySettingsFacade.setAccountScaffoldSettings( - apiKeyId, - new ApiKeySettingsFacade.ApiKeySettingsAccountScaffoldDTO( - form.version, form.superGroupTypes)); + this.apiKeySettingsFacade.setAccountScaffoldSettings( + apiKeyId, + new ApiKeySettingsFacade.ApiKeySettingsAccountScaffoldDTO( + form.version, + form.superGroupTypes.stream() + .map( + accountScaffoldType -> + new ApiKeySettingsFacade.AccountScaffoldTypeDTO( + accountScaffoldType.type, + "on".equals(accountScaffoldType.requiresManaged))) + .toList())); - loadApiKeySettingsAccountScaffold(mv, apiKey.id()); - } else if (apiKey.keyType().equals("INFO")) { - this.apiKeySettingsFacade.setInfoSettings( - apiKeyId, - new ApiKeySettingsFacade.ApiKeySettingsInfoDTO(form.version, form.superGroupTypes)); + loadApiKeySettingsAccountScaffold(mv, apiKey.id()); - loadApiKeySettingsInfo(mv, apiKey.id()); + mv.addObject("apiKeyId", apiKeyId); + + return mv; + } + + @PutMapping("/api-keys/{apiKeyId}/info-settings") + public ModelAndView updateInfoSettings( + @RequestHeader(value = "HX-Request", required = false) boolean htmxRequest, + @PathVariable("apiKeyId") UUID apiKeyId, + InfoApiKeySettings form) { + + Optional apiKeyMaybe = this.apiKeyFacade.getById(apiKeyId); + + if (apiKeyMaybe.isEmpty()) { + throw new RuntimeException(); } + ApiKeyFacade.ApiKeyDTO apiKey = apiKeyMaybe.get(); + + ModelAndView mv = new ModelAndView("api-key-details/info-settings"); + + this.apiKeySettingsFacade.setInfoSettings( + apiKeyId, + new ApiKeySettingsFacade.ApiKeySettingsInfoDTO(form.version, form.superGroupTypes)); + + loadApiKeySettingsInfo(mv, apiKey.id()); + mv.addObject("apiKeyId", apiKeyId); return mv; diff --git a/app/src/main/java/it/chalmers/gamma/adapter/secondary/jpa/apikey/settings/AccountScaffoldRequiresManagedEntity.java b/app/src/main/java/it/chalmers/gamma/adapter/secondary/jpa/apikey/settings/AccountScaffoldRequiresManagedEntity.java new file mode 100644 index 000000000..a34ad5a26 --- /dev/null +++ b/app/src/main/java/it/chalmers/gamma/adapter/secondary/jpa/apikey/settings/AccountScaffoldRequiresManagedEntity.java @@ -0,0 +1,24 @@ +package it.chalmers.gamma.adapter.secondary.jpa.apikey.settings; + +import it.chalmers.gamma.adapter.secondary.jpa.util.ImmutableEntity; +import jakarta.persistence.*; +import java.util.UUID; + +@Entity +@Table(name = "g_api_key_account_scaffold_requires_managed") +public class AccountScaffoldRequiresManagedEntity + extends ImmutableEntity { + + @EmbeddedId AccountScaffoldRequiresManagedPK id; + + protected AccountScaffoldRequiresManagedEntity() {} + + protected AccountScaffoldRequiresManagedEntity(UUID settingsId, String type) { + this.id = new AccountScaffoldRequiresManagedPK(settingsId, type); + } + + @Override + public AccountScaffoldRequiresManagedPK getId() { + return this.id; + } +} diff --git a/app/src/main/java/it/chalmers/gamma/adapter/secondary/jpa/apikey/settings/AccountScaffoldRequiresManagedJpaRepository.java b/app/src/main/java/it/chalmers/gamma/adapter/secondary/jpa/apikey/settings/AccountScaffoldRequiresManagedJpaRepository.java new file mode 100644 index 000000000..d10d6007d --- /dev/null +++ b/app/src/main/java/it/chalmers/gamma/adapter/secondary/jpa/apikey/settings/AccountScaffoldRequiresManagedJpaRepository.java @@ -0,0 +1,6 @@ +package it.chalmers.gamma.adapter.secondary.jpa.apikey.settings; + +import org.springframework.data.jpa.repository.JpaRepository; + +public interface AccountScaffoldRequiresManagedJpaRepository + extends JpaRepository {} diff --git a/app/src/main/java/it/chalmers/gamma/adapter/secondary/jpa/apikey/settings/AccountScaffoldRequiresManagedPK.java b/app/src/main/java/it/chalmers/gamma/adapter/secondary/jpa/apikey/settings/AccountScaffoldRequiresManagedPK.java new file mode 100644 index 000000000..19984816e --- /dev/null +++ b/app/src/main/java/it/chalmers/gamma/adapter/secondary/jpa/apikey/settings/AccountScaffoldRequiresManagedPK.java @@ -0,0 +1,31 @@ +package it.chalmers.gamma.adapter.secondary.jpa.apikey.settings; + +import it.chalmers.gamma.adapter.secondary.jpa.util.PKId; +import jakarta.persistence.Column; +import jakarta.persistence.Embeddable; +import java.util.UUID; + +@Embeddable +public class AccountScaffoldRequiresManagedPK + extends PKId { + + @Column(name = "settings_id", columnDefinition = "uuid") + private UUID settingsId; + + @Column(name = "super_group_type_name") + private String type; + + @Override + public RequiresManagedPK getValue() { + return new RequiresManagedPK(this.settingsId, this.type); + } + + protected AccountScaffoldRequiresManagedPK() {} + + protected AccountScaffoldRequiresManagedPK(UUID settingsId, String type) { + this.settingsId = settingsId; + this.type = type; + } + + public record RequiresManagedPK(UUID settingsId, String type) {} +} diff --git a/app/src/main/java/it/chalmers/gamma/adapter/secondary/jpa/apikey/settings/ApiKeySettingsRepositoryAdapter.java b/app/src/main/java/it/chalmers/gamma/adapter/secondary/jpa/apikey/settings/ApiKeySettingsRepositoryAdapter.java index 307b2c3e4..769a0615f 100644 --- a/app/src/main/java/it/chalmers/gamma/adapter/secondary/jpa/apikey/settings/ApiKeySettingsRepositoryAdapter.java +++ b/app/src/main/java/it/chalmers/gamma/adapter/secondary/jpa/apikey/settings/ApiKeySettingsRepositoryAdapter.java @@ -19,14 +19,18 @@ public class ApiKeySettingsRepositoryAdapter implements ApiKeySettingsRepository private final ApiKeyJpaRepository apiKeyJpaRepository; private final ApiKeySettingsJpaRepository apiKeySettingsJpaRepository; private final SuperGroupTypeJpaRepository superGroupTypeJpaRepository; + private final AccountScaffoldRequiresManagedJpaRepository + accountScaffoldRequiresManagedJpaRepository; public ApiKeySettingsRepositoryAdapter( ApiKeyJpaRepository apiKeyJpaRepository, ApiKeySettingsJpaRepository apiKeySettingsJpaRepository, - SuperGroupTypeJpaRepository superGroupTypeJpaRepository) { + SuperGroupTypeJpaRepository superGroupTypeJpaRepository, + AccountScaffoldRequiresManagedJpaRepository accountScaffoldRequiresManagedJpaRepository) { this.apiKeyJpaRepository = apiKeyJpaRepository; this.apiKeySettingsJpaRepository = apiKeySettingsJpaRepository; this.superGroupTypeJpaRepository = superGroupTypeJpaRepository; + this.accountScaffoldRequiresManagedJpaRepository = accountScaffoldRequiresManagedJpaRepository; } @Override @@ -80,7 +84,13 @@ public ApiKeyAccountScaffoldSettings getAccountScaffoldSettings(ApiKeyId apiKeyI return new ApiKeyAccountScaffoldSettings( apiKeySettingsEntity.getVersion(), apiKeySettingsEntity.superGroupTypes.stream() - .map(ApiKeySettingsSuperGroupTypeEntity::getSuperGroupType) + .map( + entity -> + new ApiKeyAccountScaffoldSettings.Row( + entity.getSuperGroupType(), + this.accountScaffoldRequiresManagedJpaRepository.existsById( + new AccountScaffoldRequiresManagedPK( + apiKeySettingsEntity.id, entity.getSuperGroupType().value())))) .toList()); } @@ -122,9 +132,21 @@ public void setAccountScaffoldSettings( superGroupType -> new ApiKeySettingsSuperGroupTypeEntity( apiKeySettingsEntity, - superGroupTypeJpaRepository.getReferenceById(superGroupType.value()))) + superGroupTypeJpaRepository.getReferenceById( + superGroupType.type().value()))) .toList()); + for (var row : settings.superGroupTypes()) { + var pk = new AccountScaffoldRequiresManagedPK(apiKeySettingsEntity.id, row.type().value()); + var superGroupTypeRequiresManagedOptional = accountScaffoldRequiresManagedJpaRepository.findById(pk); + if (row.requiresManaged() && superGroupTypeRequiresManagedOptional.isEmpty()) { + accountScaffoldRequiresManagedJpaRepository.save( + new AccountScaffoldRequiresManagedEntity(apiKeySettingsEntity.id, row.type().value())); + } else if (!row.requiresManaged() && superGroupTypeRequiresManagedOptional.isPresent()) { + accountScaffoldRequiresManagedJpaRepository.deleteById(pk); + } + } + apiKeySettingsEntity.increaseVersion(settings.version()); this.apiKeySettingsJpaRepository.save(apiKeySettingsEntity); diff --git a/app/src/main/java/it/chalmers/gamma/app/accountscaffold/AccountScaffoldFacade.java b/app/src/main/java/it/chalmers/gamma/app/accountscaffold/AccountScaffoldFacade.java index 02760e8ef..2f8ca0211 100644 --- a/app/src/main/java/it/chalmers/gamma/app/accountscaffold/AccountScaffoldFacade.java +++ b/app/src/main/java/it/chalmers/gamma/app/accountscaffold/AccountScaffoldFacade.java @@ -54,7 +54,10 @@ public List getActiveSuperGroups() { this.apiKeySettingsRepository.getAccountScaffoldSettings(apiAuthentication.get().id()); this.groupRepository.getAll().stream() - .filter(group -> settings.superGroupTypes().contains(group.superGroup().type())) + .filter( + group -> + settings.superGroupTypes().stream() + .anyMatch(row -> row.type().equals(group.superGroup().type()))) .forEach( group -> { List activeGroupMember = @@ -80,7 +83,12 @@ public List getActiveSuperGroups() { superGroupWithMembers -> new AccountScaffoldSuperGroupDTO( superGroupWithMembers.superGroup, - new ArrayList<>(superGroupWithMembers.members))) + new ArrayList<>(superGroupWithMembers.members), + settings.superGroupTypes().stream() + .anyMatch( + row -> + row.type().equals(superGroupWithMembers.superGroup.type()) + && row.requiresManaged()))) .toList(); } @@ -100,7 +108,13 @@ public List getActiveUsers() { this.apiKeySettingsRepository.getAccountScaffoldSettings(apiAuthentication.get().id()); return this.groupRepository.getAll().stream() - .filter(group -> settings.superGroupTypes().contains(group.superGroup().type())) + .filter( + group -> + settings.superGroupTypes().stream() + .anyMatch( + row -> + (row.type().equals(group.superGroup().type())) + && row.requiresManaged())) .flatMap(group -> group.groupMembers().stream()) .map(GroupMember::user) .distinct() @@ -143,14 +157,21 @@ public AccountScaffoldUserDTO(GammaUser user) { } public record AccountScaffoldSuperGroupDTO( - String name, String prettyName, String type, List members) { + String name, + String prettyName, + String type, + List members, + boolean useManagedAccount) { public AccountScaffoldSuperGroupDTO( - SuperGroup superGroup, List members) { + SuperGroup superGroup, + List members, + boolean useManagedAccount) { this( superGroup.name().value(), superGroup.prettyName().value(), superGroup.type().value(), - members); + members, + useManagedAccount); } } diff --git a/app/src/main/java/it/chalmers/gamma/app/apikey/ApiKeySettingsFacade.java b/app/src/main/java/it/chalmers/gamma/app/apikey/ApiKeySettingsFacade.java index 0c712a56f..a86f2f911 100644 --- a/app/src/main/java/it/chalmers/gamma/app/apikey/ApiKeySettingsFacade.java +++ b/app/src/main/java/it/chalmers/gamma/app/apikey/ApiKeySettingsFacade.java @@ -48,7 +48,10 @@ public void setInfoSettings(UUID apiKeyId, ApiKeySettingsInfoDTO settings) { settings.version, settings.superGroupTypes.stream().map(SuperGroupType::new).toList())); } - public record ApiKeySettingsAccountScaffoldDTO(int version, List superGroupTypes) {} + public record AccountScaffoldTypeDTO(String type, boolean requiresManaged) {} + + public record ApiKeySettingsAccountScaffoldDTO( + int version, List superGroupTypes) {} public ApiKeySettingsAccountScaffoldDTO getAccountScaffoldSettings(UUID apiKeyId) { ApiKeyId id = new ApiKeyId(apiKeyId); @@ -60,7 +63,9 @@ public ApiKeySettingsAccountScaffoldDTO getAccountScaffoldSettings(UUID apiKeyId return new ApiKeySettingsAccountScaffoldDTO( accountScaffoldSettings.version(), - accountScaffoldSettings.superGroupTypes().stream().map(SuperGroupType::value).toList()); + accountScaffoldSettings.superGroupTypes().stream() + .map(row -> new AccountScaffoldTypeDTO(row.type().value(), row.requiresManaged())) + .toList()); } public void setAccountScaffoldSettings(UUID apiKeyId, ApiKeySettingsAccountScaffoldDTO settings) { @@ -69,6 +74,12 @@ public void setAccountScaffoldSettings(UUID apiKeyId, ApiKeySettingsAccountScaff this.apiKeySettingsRepository.setAccountScaffoldSettings( new ApiKeyId(apiKeyId), new ApiKeyAccountScaffoldSettings( - settings.version, settings.superGroupTypes.stream().map(SuperGroupType::new).toList())); + settings.version, + settings.superGroupTypes.stream() + .map( + row -> + new ApiKeyAccountScaffoldSettings.Row( + new SuperGroupType(row.type), row.requiresManaged)) + .toList())); } } diff --git a/app/src/main/java/it/chalmers/gamma/app/apikey/domain/settings/ApiKeyAccountScaffoldSettings.java b/app/src/main/java/it/chalmers/gamma/app/apikey/domain/settings/ApiKeyAccountScaffoldSettings.java index 47d7313fb..eccab5f62 100644 --- a/app/src/main/java/it/chalmers/gamma/app/apikey/domain/settings/ApiKeyAccountScaffoldSettings.java +++ b/app/src/main/java/it/chalmers/gamma/app/apikey/domain/settings/ApiKeyAccountScaffoldSettings.java @@ -3,4 +3,6 @@ import it.chalmers.gamma.app.supergroup.domain.SuperGroupType; import java.util.List; -public record ApiKeyAccountScaffoldSettings(int version, List superGroupTypes) {} +public record ApiKeyAccountScaffoldSettings(int version, List superGroupTypes) { + public record Row(SuperGroupType type, boolean requiresManaged) {} +} diff --git a/app/src/main/resources/db/migration/V5__ACCOUNT_SCAFFOLD_REQUIRES_MANAGED.sql b/app/src/main/resources/db/migration/V5__ACCOUNT_SCAFFOLD_REQUIRES_MANAGED.sql new file mode 100644 index 000000000..1fa877fda --- /dev/null +++ b/app/src/main/resources/db/migration/V5__ACCOUNT_SCAFFOLD_REQUIRES_MANAGED.sql @@ -0,0 +1,6 @@ +CREATE TABLE g_api_key_account_scaffold_requires_managed ( + created_at TIMESTAMP NOT NULL, + settings_id UUID REFERENCES g_api_key_settings ON DELETE CASCADE, + super_group_type_name VARCHAR(30) REFERENCES g_super_group_type, + PRIMARY KEY (settings_id, super_group_type_name) +); \ No newline at end of file diff --git a/app/src/main/resources/templates/api-key-details/account-scaffold-settings.html b/app/src/main/resources/templates/api-key-details/account-scaffold-settings.html new file mode 100644 index 000000000..13201b896 --- /dev/null +++ b/app/src/main/resources/templates/api-key-details/account-scaffold-settings.html @@ -0,0 +1,41 @@ +
+ + +
+ +
+
+ Account scaffold +
+

+ Set the super group types from which the information will query from +

+
+
+ + +
+ +
+
+ + +
+
+
\ No newline at end of file diff --git a/app/src/main/resources/templates/partial/api-key-super-group-types.html b/app/src/main/resources/templates/api-key-details/info-settings.html similarity index 71% rename from app/src/main/resources/templates/partial/api-key-super-group-types.html rename to app/src/main/resources/templates/api-key-details/info-settings.html index 2e9020248..74cbfa94e 100644 --- a/app/src/main/resources/templates/partial/api-key-super-group-types.html +++ b/app/src/main/resources/templates/api-key-details/info-settings.html @@ -1,19 +1,22 @@ -
-
> +
+ Info settings
-

+

+ Set the super group types from which the information will be query from. +

+ th:each="type : ${settings_form.superGroupTypes}" + _="on load call updateNames('superGroupTypes', 'select')"> @@ -24,7 +27,7 @@
- diff --git a/app/src/main/resources/templates/api-key-details/new-type-to-account-scaffold-settings.html b/app/src/main/resources/templates/api-key-details/new-type-to-account-scaffold-settings.html new file mode 100644 index 000000000..347515d27 --- /dev/null +++ b/app/src/main/resources/templates/api-key-details/new-type-to-account-scaffold-settings.html @@ -0,0 +1,7 @@ + + \ No newline at end of file diff --git a/app/src/main/resources/templates/partial/new-super-group-type-to-api-settings.html b/app/src/main/resources/templates/api-key-details/new-type-to-info-settings.html similarity index 100% rename from app/src/main/resources/templates/partial/new-super-group-type-to-api-settings.html rename to app/src/main/resources/templates/api-key-details/new-type-to-info-settings.html diff --git a/app/src/main/resources/templates/pages/api-key-not-found.html b/app/src/main/resources/templates/api-key-details/not-found.html similarity index 100% rename from app/src/main/resources/templates/pages/api-key-not-found.html rename to app/src/main/resources/templates/api-key-details/not-found.html diff --git a/app/src/main/resources/templates/pages/api-key-details.html b/app/src/main/resources/templates/api-key-details/page.html similarity index 90% rename from app/src/main/resources/templates/pages/api-key-details.html rename to app/src/main/resources/templates/api-key-details/page.html index ad057ec89..8a33ea779 100644 --- a/app/src/main/resources/templates/pages/api-key-details.html +++ b/app/src/main/resources/templates/api-key-details/page.html @@ -47,7 +47,10 @@
- -
+ +
+
+ +
\ No newline at end of file diff --git a/app/src/main/resources/templates/client-details/page.html b/app/src/main/resources/templates/client-details/page.html index 7aebfc3b9..fbf91affc 100644 --- a/app/src/main/resources/templates/client-details/page.html +++ b/app/src/main/resources/templates/client-details/page.html @@ -57,7 +57,7 @@
-
+