From 4286934d9d9d5961b8b80501e0b9f4d8b80bfe57 Mon Sep 17 00:00:00 2001 From: mukeshs Date: Thu, 20 Nov 2025 16:21:48 +0530 Subject: [PATCH] Service tabs updated --- .../controller/ServiceTileResource.java | 10 ++-- .../backend/domain/ServiceTile.java | 5 ++ .../enumeration/ServiceTileCategory.java | 16 ++++++ .../backend/service/ServiceTileService.java | 5 +- .../service/impl/ServiceTileServiceImpl.java | 11 ++-- .../service-tile/service-tile.component.css | 36 ++++++++++++ .../service-tile/service-tile.component.html | 55 +++++++++++++++---- .../service-tile/service-tile.component.ts | 39 +++++++++---- .../src/app/model/service-tile.model.ts | 1 + 9 files changed, 144 insertions(+), 34 deletions(-) create mode 100644 support-portal-backend/src/main/java/net/shyshkin/study/fullstack/supportportal/backend/enumeration/ServiceTileCategory.java diff --git a/support-portal-backend/src/main/java/net/shyshkin/study/fullstack/supportportal/backend/controller/ServiceTileResource.java b/support-portal-backend/src/main/java/net/shyshkin/study/fullstack/supportportal/backend/controller/ServiceTileResource.java index 13d6bc2..3758fa8 100644 --- a/support-portal-backend/src/main/java/net/shyshkin/study/fullstack/supportportal/backend/controller/ServiceTileResource.java +++ b/support-portal-backend/src/main/java/net/shyshkin/study/fullstack/supportportal/backend/controller/ServiceTileResource.java @@ -4,6 +4,7 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import net.shyshkin.study.fullstack.supportportal.backend.domain.ServiceTile; import net.shyshkin.study.fullstack.supportportal.backend.domain.HttpResponse; +import net.shyshkin.study.fullstack.supportportal.backend.enumeration.ServiceTileCategory; import net.shyshkin.study.fullstack.supportportal.backend.service.ServiceTileService; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -26,10 +27,11 @@ public class ServiceTileResource { public ResponseEntity addServiceTile( @RequestParam String title, @RequestParam(required = false) String description, + @RequestParam ServiceTileCategory category, @RequestParam(required = false) Integer displayOrder) { - log.info("Adding new service tile with title: {}", title); - ServiceTile serviceTile = serviceTileService.addServiceTile(title, description, displayOrder); + log.info("Adding new service tile with title: {} and category: {}", title, category); + ServiceTile serviceTile = serviceTileService.addServiceTile(title, description, category, displayOrder); return ResponseEntity.status(HttpStatus.CREATED).body(serviceTile); } @@ -39,10 +41,11 @@ public class ServiceTileResource { @PathVariable Long id, @RequestParam String title, @RequestParam(required = false) String description, + @RequestParam ServiceTileCategory category, @RequestParam(required = false) Integer displayOrder) { log.info("Updating service tile with id: {}", id); - ServiceTile serviceTile = serviceTileService.updateServiceTile(id, title, description, displayOrder); + ServiceTile serviceTile = serviceTileService.updateServiceTile(id, title, description, category, displayOrder); return ResponseEntity.ok(serviceTile); } @@ -83,7 +86,6 @@ public class ServiceTileResource { ); } - @PutMapping("/{id}/toggle-active") @PreAuthorize("hasAnyAuthority('user:update')") public ResponseEntity toggleActiveStatus(@PathVariable Long id) { diff --git a/support-portal-backend/src/main/java/net/shyshkin/study/fullstack/supportportal/backend/domain/ServiceTile.java b/support-portal-backend/src/main/java/net/shyshkin/study/fullstack/supportportal/backend/domain/ServiceTile.java index 8f63d8d..c524e85 100644 --- a/support-portal-backend/src/main/java/net/shyshkin/study/fullstack/supportportal/backend/domain/ServiceTile.java +++ b/support-portal-backend/src/main/java/net/shyshkin/study/fullstack/supportportal/backend/domain/ServiceTile.java @@ -4,6 +4,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; +import net.shyshkin.study.fullstack.supportportal.backend.enumeration.ServiceTileCategory; import javax.persistence.*; import java.io.Serializable; @@ -27,6 +28,10 @@ public class ServiceTile implements Serializable { @Column(length = 1000) private String description; + @Enumerated(EnumType.STRING) + @Column(nullable = false) + private ServiceTileCategory category; + @JsonProperty("isActive") @Column(name = "is_active") private boolean isActive; diff --git a/support-portal-backend/src/main/java/net/shyshkin/study/fullstack/supportportal/backend/enumeration/ServiceTileCategory.java b/support-portal-backend/src/main/java/net/shyshkin/study/fullstack/supportportal/backend/enumeration/ServiceTileCategory.java new file mode 100644 index 0000000..131890e --- /dev/null +++ b/support-portal-backend/src/main/java/net/shyshkin/study/fullstack/supportportal/backend/enumeration/ServiceTileCategory.java @@ -0,0 +1,16 @@ +package net.shyshkin.study.fullstack.supportportal.backend.enumeration; + +public enum ServiceTileCategory { + TRAUMA_CARE("Trauma Care"), + ACUTE_CARE_SURGERY("Acute Care Surgery"); + + private final String displayName; + + ServiceTileCategory(String displayName) { + this.displayName = displayName; + } + + public String getDisplayName() { + return displayName; + } +} \ No newline at end of file diff --git a/support-portal-backend/src/main/java/net/shyshkin/study/fullstack/supportportal/backend/service/ServiceTileService.java b/support-portal-backend/src/main/java/net/shyshkin/study/fullstack/supportportal/backend/service/ServiceTileService.java index 3eeb13d..9b93d4e 100644 --- a/support-portal-backend/src/main/java/net/shyshkin/study/fullstack/supportportal/backend/service/ServiceTileService.java +++ b/support-portal-backend/src/main/java/net/shyshkin/study/fullstack/supportportal/backend/service/ServiceTileService.java @@ -1,14 +1,15 @@ package net.shyshkin.study.fullstack.supportportal.backend.service; import net.shyshkin.study.fullstack.supportportal.backend.domain.ServiceTile; +import net.shyshkin.study.fullstack.supportportal.backend.enumeration.ServiceTileCategory; import java.util.List; public interface ServiceTileService { - ServiceTile addServiceTile(String title, String description, Integer displayOrder); + ServiceTile addServiceTile(String title, String description, ServiceTileCategory category, Integer displayOrder); - ServiceTile updateServiceTile(Long id, String title, String description, Integer displayOrder); + ServiceTile updateServiceTile(Long id, String title, String description, ServiceTileCategory category, Integer displayOrder); List getActiveServiceTiles(); diff --git a/support-portal-backend/src/main/java/net/shyshkin/study/fullstack/supportportal/backend/service/impl/ServiceTileServiceImpl.java b/support-portal-backend/src/main/java/net/shyshkin/study/fullstack/supportportal/backend/service/impl/ServiceTileServiceImpl.java index a223e5b..e0f6193 100644 --- a/support-portal-backend/src/main/java/net/shyshkin/study/fullstack/supportportal/backend/service/impl/ServiceTileServiceImpl.java +++ b/support-portal-backend/src/main/java/net/shyshkin/study/fullstack/supportportal/backend/service/impl/ServiceTileServiceImpl.java @@ -3,6 +3,7 @@ package net.shyshkin.study.fullstack.supportportal.backend.service.impl; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import net.shyshkin.study.fullstack.supportportal.backend.domain.ServiceTile; +import net.shyshkin.study.fullstack.supportportal.backend.enumeration.ServiceTileCategory; import net.shyshkin.study.fullstack.supportportal.backend.exception.domain.ServiceTileNotFoundException; import net.shyshkin.study.fullstack.supportportal.backend.repository.ServiceTileRepository; import net.shyshkin.study.fullstack.supportportal.backend.service.ServiceTileService; @@ -20,25 +21,27 @@ public class ServiceTileServiceImpl implements ServiceTileService { private final ServiceTileRepository serviceTileRepository; @Override - public ServiceTile addServiceTile(String title, String description, Integer displayOrder) { - log.info("Adding new service tile with title: {}", title); + public ServiceTile addServiceTile(String title, String description, ServiceTileCategory category, Integer displayOrder) { + log.info("Adding new service tile with title: {} and category: {}", title, category); ServiceTile serviceTile = new ServiceTile(); serviceTile.setTitle(title); serviceTile.setDescription(description); + serviceTile.setCategory(category); serviceTile.setDisplayOrder(displayOrder != null ? displayOrder : 0); - serviceTile.setActive(true); // New tiles are active by default + serviceTile.setActive(true); return serviceTileRepository.save(serviceTile); } @Override - public ServiceTile updateServiceTile(Long id, String title, String description, Integer displayOrder) { + public ServiceTile updateServiceTile(Long id, String title, String description, ServiceTileCategory category, Integer displayOrder) { log.info("Updating service tile with id: {}", id); ServiceTile serviceTile = getServiceTileById(id); serviceTile.setTitle(title); serviceTile.setDescription(description); + serviceTile.setCategory(category); if (displayOrder != null) { serviceTile.setDisplayOrder(displayOrder); diff --git a/support-portal-frontend/src/app/component/service-tile/service-tile.component.css b/support-portal-frontend/src/app/component/service-tile/service-tile.component.css index 1556870..54d7f91 100644 --- a/support-portal-frontend/src/app/component/service-tile/service-tile.component.css +++ b/support-portal-frontend/src/app/component/service-tile/service-tile.component.css @@ -426,6 +426,42 @@ font-size: 14px; flex: 1; } +/* Add to existing CSS */ + +.badge-group { + display: flex; + align-items: center; + gap: 8px; +} + +.category-badge { + display: inline-flex; + align-items: center; + padding: 4px 10px; + background: #e0e7ff; + color: #4338ca; + border-radius: 6px; + font-size: 11px; + font-weight: 600; + text-transform: uppercase; + letter-spacing: 0.5px; +} + +/* Select dropdown styling */ +select.form-input { + cursor: pointer; + appearance: none; + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%236b7280' d='M6 9L1 4h10z'/%3E%3C/svg%3E"); + background-repeat: no-repeat; + background-position: right 12px center; + padding-right: 40px; +} + +select.form-input:focus { + outline: none; + border-color: #3b82f6; + box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1); +} /* Form Styles */ .form-section { diff --git a/support-portal-frontend/src/app/component/service-tile/service-tile.component.html b/support-portal-frontend/src/app/component/service-tile/service-tile.component.html index e91db12..00fce12 100644 --- a/support-portal-frontend/src/app/component/service-tile/service-tile.component.html +++ b/support-portal-frontend/src/app/component/service-tile/service-tile.component.html @@ -31,12 +31,15 @@

{{ serviceTile?.title }}

- - - {{ serviceTile?.isActive ? 'Active' : 'Inactive' }} - +
+ {{ getCategoryLabel(serviceTile?.category) }} + + + {{ serviceTile?.isActive ? 'Active' : 'Inactive' }} + +

{{ serviceTile.description }}

@@ -92,14 +95,20 @@