diff --git a/README.md b/README.md index aed7c9b4b..df2cb0ccd 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ [![GitHub commit activity](https://img.shields.io/github/commit-activity/y/softwaremagico/KendoTournamentManager)](https://github.com/softwaremagico/KendoTournamentManager) [![GitHub last commit](https://img.shields.io/github/last-commit/softwaremagico/KendoTournamentManager)](https://github.com/softwaremagico/KendoTournamentManager) [![CircleCI](https://circleci.com/gh/softwaremagico/KendoTournamentManager.svg?style=shield)](https://circleci.com/gh/softwaremagico/KendoTournamentManager) -[![Time](https://img.shields.io/badge/development-654h-blueviolet.svg)]() +[![Time](https://img.shields.io/badge/development-655h-blueviolet.svg)]() [![Powered by](https://img.shields.io/badge/powered%20by%20java-orange.svg?logo=OpenJDK&logoColor=white)]() [![Vulnerabilities](https://sonarcloud.io/api/project_badges/measure?project=kendo-tournament-backend&metric=vulnerabilities)](https://sonarcloud.io/summary/new_code?id=kendo-tournament-backend) diff --git a/backend/kendo-tournament-core/src/main/java/com/softwaremagico/kt/core/controller/QrController.java b/backend/kendo-tournament-core/src/main/java/com/softwaremagico/kt/core/controller/QrController.java index 600105651..37011937a 100644 --- a/backend/kendo-tournament-core/src/main/java/com/softwaremagico/kt/core/controller/QrController.java +++ b/backend/kendo-tournament-core/src/main/java/com/softwaremagico/kt/core/controller/QrController.java @@ -51,7 +51,10 @@ public class QrController { private static final String LOGO_RESOURCE = "/kote.svg"; private static final String QR_FORMAT = "png"; private static final Integer QR_SIZE = 500; - private static final Color QR_COLOR = Color.decode("#001239"); + private static final Color QR_COLOR_LIGHT_MODE = Color.decode("#001239"); + private static final Color QR_COLOR_NIGHT_MODE = Color.decode("#b0a3d5"); + private static final Color BACKGROUND_LIGHT_MODE = Color.decode("#ffffff"); + private static final Color BACKGROUND_NIGHT_MODE = Color.decode("#424242"); private final QrProvider qrProvider; @@ -72,14 +75,17 @@ public QrController(QrProvider qrProvider, TournamentProvider tournamentProvider } @Cacheable(cacheNames = "qr-codes", key = "#tournamentId") - public QrCodeDTO generateGuestQrCodeForTournamentFights(Integer tournamentId, Integer port) { + public QrCodeDTO generateGuestQrCodeForTournamentFights(Integer tournamentId, Integer port, boolean nightMode) { //Check that exists. final Tournament tournament = tournamentProvider.get(tournamentId).orElseThrow(() -> new TournamentNotFoundException(this.getClass(), "No tournament found with id '" + tournamentId + "'.")); try { final String link = schema + "://" + machineDomain + (port != null ? ":" + port : "") + TOURNAMENT_FIGHTS_URL + "?tournamentId=" + tournament.getId() + "&user=guest"; - final BufferedImage qrCode = qrProvider.getQr(link, QR_SIZE, QR_COLOR, LOGO_RESOURCE); + final BufferedImage qrCode = qrProvider.getQr(link, QR_SIZE, + !nightMode ? QR_COLOR_LIGHT_MODE : QR_COLOR_NIGHT_MODE, + LOGO_RESOURCE, + !nightMode ? BACKGROUND_LIGHT_MODE : BACKGROUND_NIGHT_MODE); final QrCodeDTO qrCodeDTO = new QrCodeDTO(); qrCodeDTO.setData(toByteArray(qrCode, QR_FORMAT)); qrCodeDTO.setLink(link); @@ -96,7 +102,7 @@ public QrCodeDTO generateGuestQrCodeForTournamentFights(Integer tournamentId, In * @param port if the frontend is running on a different port. * @return */ - public QrCodeDTO generateParticipantQrCodeForStatistics(Integer participantId, Integer port) { + public QrCodeDTO generateParticipantQrCodeForStatistics(Integer participantId, Integer port, boolean nightMode) { final Participant participant = participantProvider.get(participantId).orElseThrow(() -> new ParticipantNotFoundException(this.getClass(), "No participant found with id '" + participantId + "'.")); @@ -106,7 +112,10 @@ public QrCodeDTO generateParticipantQrCodeForStatistics(Integer participantId, I final String link = schema + "://" + machineDomain + (port != null ? ":" + port : "") + PARTICIPANT_STATISTICS_URL + "?participantId=" + participantId + "&temporalToken=" + URLEncoder.encode(temporalToken.getContent(), StandardCharsets.UTF_8); - final BufferedImage qrCode = qrProvider.getQr(link, QR_SIZE, QR_COLOR, LOGO_RESOURCE); + final BufferedImage qrCode = qrProvider.getQr(link, QR_SIZE, + !nightMode ? QR_COLOR_LIGHT_MODE : QR_COLOR_NIGHT_MODE, + LOGO_RESOURCE, + !nightMode ? BACKGROUND_LIGHT_MODE : BACKGROUND_NIGHT_MODE); final QrCodeDTO qrCodeDTO = new QrCodeDTO(); qrCodeDTO.setData(toByteArray(qrCode, QR_FORMAT)); qrCodeDTO.setLink(link); diff --git a/backend/kendo-tournament-core/src/main/java/com/softwaremagico/kt/core/providers/QrProvider.java b/backend/kendo-tournament-core/src/main/java/com/softwaremagico/kt/core/providers/QrProvider.java index cff96fbcc..6e9be83a4 100644 --- a/backend/kendo-tournament-core/src/main/java/com/softwaremagico/kt/core/providers/QrProvider.java +++ b/backend/kendo-tournament-core/src/main/java/com/softwaremagico/kt/core/providers/QrProvider.java @@ -34,6 +34,7 @@ import org.apache.batik.transcoder.TranscoderException; import org.apache.batik.transcoder.TranscoderInput; import org.apache.batik.transcoder.TranscoderOutput; +import org.apache.batik.transcoder.image.ImageTranscoder; import org.apache.batik.transcoder.image.PNGTranscoder; import org.apache.batik.util.XMLResourceDescriptor; import org.springframework.stereotype.Service; @@ -52,6 +53,8 @@ import java.io.InputStream; import java.io.StringReader; import java.nio.charset.StandardCharsets; +import java.util.HashMap; +import java.util.Map; import java.util.Scanner; @Service @@ -60,10 +63,10 @@ public class QrProvider { private static final float DEFAULT_SVG_SIZE = 200F; private static final double BORDER_RELATIVE_SIZE = 0.02d; private static final double BORDER_RADIUS = 0.03d; - private static BufferedImage qrLogo; + private static Map qrLogoByBackground = new HashMap<>(); public QrPositionalSquaresConfig crateSquareConfig(Boolean circleShaped, Double relativeSquareBorderRound, - Color center, Color innerSquare, Color outerSquare, Color outerBorder) { + Color center, Color outerSquare, Color background) { final QrPositionalSquaresConfig.Builder builder = new QrPositionalSquaresConfig.Builder(); if (circleShaped != null) { @@ -78,34 +81,34 @@ public QrPositionalSquaresConfig crateSquareConfig(Boolean circleShaped, Double builder.centerColor(center); } - if (innerSquare != null) { - builder.innerSquareColor(innerSquare); + if (background != null) { + builder.innerSquareColor(background); } if (outerSquare != null) { builder.outerSquareColor(outerSquare); } - if (outerBorder != null) { - builder.outerBorderColor(outerBorder); + if (background != null) { + builder.outerBorderColor(background); } return builder.build(); } - public BufferedImage getQr(String content, Integer size, Color color) { + public BufferedImage getQr(String content, Integer size, Color color, Color background) { return getQr(content, size, color, color, null, null, - crateSquareConfig(false, null, color, null, color, null), + crateSquareConfig(false, null, color, color, background), null); } - public BufferedImage getQr(String content, Integer size, Color color, String resourceLogo) { - return getQr(content, size, color, resourceLogo, true); + public BufferedImage getQr(String content, Integer size, Color color, String resourceLogo, Color background) { + return getQr(content, size, color, resourceLogo, true, background); } - public BufferedImage getQr(String content, Integer size, Color color, String resourceLogo, boolean circleShaped) { - return getQr(content, size, color, color, null, resourceLogo, - crateSquareConfig(circleShaped, null, color, null, color, null), + public BufferedImage getQr(String content, Integer size, Color color, String resourceLogo, boolean circleShaped, Color background) { + return getQr(content, size, color, color, background, resourceLogo, + crateSquareConfig(circleShaped, null, color, color, background), null); } @@ -141,7 +144,7 @@ public BufferedImage getQr(String content, Integer size, Color borderColor, Colo try { final BufferedImage logoImage; if (resourceLogo.endsWith(".svg")) { - logoImage = readSvgResource(resourceLogo, size != null ? (float) size : DEFAULT_SVG_SIZE, ink); + logoImage = readSvgResource(resourceLogo, size != null ? (float) size : DEFAULT_SVG_SIZE, ink, background); } else { logoImage = readImageResource(resourceLogo); } @@ -177,19 +180,23 @@ private BufferedImage readImageResource(String resourceLogo) { return null; } - private BufferedImage readSvgResource(String resourceLogo, float size, Color ink) throws IOException, TranscoderException { - if (qrLogo == null) { + private BufferedImage readSvgResource(String resourceLogo, float size, Color ink, Color background) throws IOException, TranscoderException { + if (qrLogoByBackground.get(background) == null) { //Get SVG File. final InputStream inputStream = QrProvider.class.getResourceAsStream(resourceLogo); if (inputStream == null) { return null; } final String svgText = new Scanner(inputStream, StandardCharsets.UTF_8).useDelimiter("\\A").next(); - final SVGDocument svgDocument = updateLogoColor(svgText, ink); + final SVGDocument svgDocument = updateLogoColor(svgText, ink, background); //Convert to PNG. final Transcoder pngTranscoder = new PNGTranscoder(); + //Background. + //pngTranscoder.addTranscodingHint(PNGTranscoder.KEY_FORCE_TRANSPARENT_WHITE, true); + pngTranscoder.addTranscodingHint(ImageTranscoder.KEY_BACKGROUND_COLOR, background); + // Set the transcoding hints. pngTranscoder.addTranscodingHint(SVGAbstractTranscoder.KEY_WIDTH, size / 2); pngTranscoder.addTranscodingHint(SVGAbstractTranscoder.KEY_HEIGHT, size / 2); @@ -209,18 +216,18 @@ private BufferedImage readSvgResource(String resourceLogo, float size, Color ink // Convert the byte stream into an image. final byte[] imgData = outputStream.toByteArray(); - qrLogo = ImageIO.read(new ByteArrayInputStream(imgData)); + qrLogoByBackground.put(background, ImageIO.read(new ByteArrayInputStream(imgData))); } - return qrLogo; + return qrLogoByBackground.get(background); } - private SVGDocument updateLogoColor(String svgText, Color color) throws IOException { + private SVGDocument updateLogoColor(String svgText, Color ink, Color background) throws IOException { final StringReader reader = new StringReader(svgText); final String uri = "file:svgImage"; final String parser = XMLResourceDescriptor.getXMLParserClassName(); final SAXSVGDocumentFactory f = new SAXSVGDocumentFactory(parser); final SVGDocument svgDocument = f.createSVGDocument(uri, reader); - if (color != null) { + if (ink != null) { final NodeList styleList = svgDocument.getElementsByTagName("path"); for (int i = 0; i < styleList.getLength(); i++) { // To search only "style" desired children @@ -228,7 +235,19 @@ private SVGDocument updateLogoColor(String svgText, Color color) throws IOExcept if (defsChild.getNodeType() == Node.ELEMENT_NODE) { final Element element = (Element) defsChild; element.setAttributeNS(null, "fill", "#" - + Integer.toHexString(color.getRGB()).substring(2)); + + Integer.toHexString(ink.getRGB()).substring(2)); + } + } + } + if (background != null) { + final NodeList styleList = svgDocument.getElementsByTagName("circle"); + for (int i = 0; i < styleList.getLength(); i++) { + // To search only "style" desired children + final Node defsChild = styleList.item(i); + if (defsChild.getNodeType() == Node.ELEMENT_NODE) { + final Element element = (Element) defsChild; + element.setAttributeNS(null, "fill", "#" + + Integer.toHexString(background.getRGB()).substring(2)); } } } diff --git a/backend/kendo-tournament-pdf/src/main/java/com/softwaremagico/kt/pdf/controller/PdfController.java b/backend/kendo-tournament-pdf/src/main/java/com/softwaremagico/kt/pdf/controller/PdfController.java index 6d7c8ffad..dc64f6185 100644 --- a/backend/kendo-tournament-pdf/src/main/java/com/softwaremagico/kt/pdf/controller/PdfController.java +++ b/backend/kendo-tournament-pdf/src/main/java/com/softwaremagico/kt/pdf/controller/PdfController.java @@ -250,7 +250,7 @@ private float getNamePosition(TournamentDTO tournamentDTO) { } public TournamentQr generateTournamentQr(Locale locale, TournamentDTO tournament, Integer port) { - final QrCodeDTO qrCodeDTO = qrController.generateGuestQrCodeForTournamentFights(tournament.getId(), port); + final QrCodeDTO qrCodeDTO = qrController.generateGuestQrCodeForTournamentFights(tournament.getId(), port, false); return new TournamentQr(messageSource, locale, tournament, qrCodeDTO.getData(), null); } } diff --git a/backend/kendo-tournament-rest/src/main/java/com/softwaremagico/kt/rest/services/QrService.java b/backend/kendo-tournament-rest/src/main/java/com/softwaremagico/kt/rest/services/QrService.java index d05f31c66..e42ad2502 100644 --- a/backend/kendo-tournament-rest/src/main/java/com/softwaremagico/kt/rest/services/QrService.java +++ b/backend/kendo-tournament-rest/src/main/java/com/softwaremagico/kt/rest/services/QrService.java @@ -42,9 +42,11 @@ import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import java.util.Locale; +import java.util.Optional; @RestController @RequestMapping("/qr") @@ -69,8 +71,9 @@ public QrService(QrController qrController, PdfController pdfController, Tournam @GetMapping(value = "/guest/tournament/{tournamentId}", produces = MediaType.APPLICATION_JSON_VALUE) public QrCodeDTO generateGuestQrCodeForTournamentFights(@Parameter(description = "Id of an existing tournament", required = true) @PathVariable("tournamentId") Integer tournamentId, + @RequestParam(name = "nightMode", required = false) Optional nightMode, HttpServletResponse response, HttpServletRequest request) { - return qrController.generateGuestQrCodeForTournamentFights(tournamentId, null); + return qrController.generateGuestQrCodeForTournamentFights(tournamentId, null, nightMode.orElse(false)); } @@ -79,14 +82,15 @@ public QrCodeDTO generateGuestQrCodeForTournamentFights(@Parameter(description = security = @SecurityRequirement(name = "bearerAuth")) @GetMapping(value = "/guest/tournament/{tournamentId}/png", produces = MediaType.IMAGE_PNG_VALUE) public byte[] generateGuestQrCodeForTournamentFightsImage(@Parameter(description = "Id of an existing tournament", required = true) - @PathVariable("tournamentId") Integer tournamentId, - HttpServletResponse response, HttpServletRequest request) { + @PathVariable("tournamentId") Integer tournamentId, + @RequestParam(name = "nightMode", required = false) Optional nightMode, + HttpServletResponse response, HttpServletRequest request) { final ContentDisposition contentDisposition = ContentDisposition.builder("attachment") .filename("Tournament - QR.png").build(); response.setHeader(HttpHeaders.CONTENT_DISPOSITION, contentDisposition.toString()); - return qrController.generateGuestQrCodeForTournamentFights(tournamentId, null).getData(); + return qrController.generateGuestQrCodeForTournamentFights(tournamentId, null, nightMode.orElse(false)).getData(); } @@ -98,9 +102,10 @@ public QrCodeDTO generateGuestQrCodeForTournamentFights(@Parameter(description = @PathVariable("tournamentId") Integer tournamentId, @Parameter(description = "Frontend port") @PathVariable("port") Integer port, + @RequestParam(name = "nightMode", required = false) Optional nightMode, HttpServletResponse response, HttpServletRequest request) { - return qrController.generateGuestQrCodeForTournamentFights(tournamentId, port); + return qrController.generateGuestQrCodeForTournamentFights(tournamentId, port, nightMode.orElse(false)); } @@ -109,16 +114,17 @@ public QrCodeDTO generateGuestQrCodeForTournamentFights(@Parameter(description = security = @SecurityRequirement(name = "bearerAuth")) @GetMapping(value = "/guest/tournament/{tournamentId}/port/{port}/png", produces = MediaType.IMAGE_PNG_VALUE) public byte[] generateGuestQrCodeForTournamentFightsImage(@Parameter(description = "Id of an existing tournament", required = true) - @PathVariable("tournamentId") Integer tournamentId, - @Parameter(description = "Frontend port") - @PathVariable("port") Integer port, - HttpServletResponse response, HttpServletRequest request) { + @PathVariable("tournamentId") Integer tournamentId, + @Parameter(description = "Frontend port") + @PathVariable("port") Integer port, + @RequestParam(name = "nightMode", required = false) Optional nightMode, + HttpServletResponse response, HttpServletRequest request) { final ContentDisposition contentDisposition = ContentDisposition.builder("attachment") .filename("Tournament - QR.png").build(); response.setHeader(HttpHeaders.CONTENT_DISPOSITION, contentDisposition.toString()); - return qrController.generateGuestQrCodeForTournamentFights(tournamentId, port).getData(); + return qrController.generateGuestQrCodeForTournamentFights(tournamentId, port, nightMode.orElse(false)).getData(); } @@ -170,13 +176,14 @@ public byte[] getParticipantDiplomaFromTournamentAsPdf(@Parameter(description = @GetMapping(value = "/participant/{participantId}/statistics", produces = MediaType.APPLICATION_JSON_VALUE) public QrCodeDTO generateParticipantQrCodeForStatistics(@Parameter(description = "Id of an existing participant", required = true) @PathVariable("participantId") Integer participantId, + @RequestParam(name = "nightMode", required = false) Optional nightMode, HttpServletResponse response, HttpServletRequest request) { final ContentDisposition contentDisposition = ContentDisposition.builder("attachment") .filename("Statistics - QR.png").build(); response.setHeader(HttpHeaders.CONTENT_DISPOSITION, contentDisposition.toString()); - return qrController.generateParticipantQrCodeForStatistics(participantId, null); + return qrController.generateParticipantQrCodeForStatistics(participantId, null, nightMode.orElse(false)); } @PreAuthorize("hasAnyRole('ROLE_EDITOR', 'ROLE_ADMIN')") @@ -187,12 +194,13 @@ public QrCodeDTO generateParticipantQrCodeForStatisticsWithPort(@Parameter(descr @PathVariable("participantId") Integer participantId, @Parameter(description = "Frontend port") @PathVariable("port") Integer port, + @RequestParam(name = "nightMode", required = false) Optional nightMode, HttpServletResponse response, HttpServletRequest request) { final ContentDisposition contentDisposition = ContentDisposition.builder("attachment") .filename("Statistics - QR.png").build(); response.setHeader(HttpHeaders.CONTENT_DISPOSITION, contentDisposition.toString()); - return qrController.generateParticipantQrCodeForStatistics(participantId, port); + return qrController.generateParticipantQrCodeForStatistics(participantId, port, nightMode.orElse(false)); } } diff --git a/backend/kendo-tournament-rest/src/main/resources/kote.svg b/backend/kendo-tournament-rest/src/main/resources/kote.svg index 897a653d9..14241b550 100644 --- a/backend/kendo-tournament-rest/src/main/resources/kote.svg +++ b/backend/kendo-tournament-rest/src/main/resources/kote.svg @@ -29,7 +29,7 @@ xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg"> - + - - - - - + + + + + - + + + - - -
{{'competitorsRanking' | translate}}{{ 'competitorsRanking' | translate }}
{{'competitor' | translate}}{{'duelsWon' | translate}}{{'duelsDraw' | translate}}{{'histsWon' | translate}}{{'totalFights' | translate}}{{ 'competitor' | translate }}{{ 'duelsWon' | translate }}{{ 'duelsDraw' | translate }}{{ 'histsWon' | translate }}{{ 'totalFights' | translate }}
{{showIndex ? i + 1 + ". " : ""}}{{scoreOfCompetitor.competitor.lastname}} - , {{scoreOfCompetitor.competitor.name}} + class="competitor-ranking-value competitor-name">{{ showIndex ? i + 1 + ". " : "" }}{{ scoreOfCompetitor.competitor.lastname }} + , {{ scoreOfCompetitor.competitor.name }} {{scoreOfCompetitor.wonDuels}}{{(scoreOfCompetitor.untieDuels ? "*" : "")}} + {{ scoreOfCompetitor.wonDuels }}{{ (scoreOfCompetitor.untieDuels ? "*" : "") }} + {{ scoreOfCompetitor.drawDuels }} + {{ scoreOfCompetitor.hits }}{{ (scoreOfCompetitor.untieHits ? "*" : "") }} + {{ scoreOfCompetitor.totalFights }} {{scoreOfCompetitor.drawDuels}}{{scoreOfCompetitor.hits}}{{(scoreOfCompetitor.untieHits ? "*" : "")}}{{scoreOfCompetitor.totalFights}}
@@ -41,7 +47,7 @@ mat-flat-button mat-raised-button> file_download - {{'download' | translate}} + {{ 'download' | translate }} - + diff --git a/frontend/src/app/components/competitors-ranking/competitors-ranking.component.scss b/frontend/src/app/components/competitors-ranking/competitors-ranking.component.scss index 478fc849d..33cd06323 100644 --- a/frontend/src/app/components/competitors-ranking/competitors-ranking.component.scss +++ b/frontend/src/app/components/competitors-ranking/competitors-ranking.component.scss @@ -17,8 +17,12 @@ position: sticky; top: 0; z-index: 1; - background: white; - height: 60px; + background: var(--table-header-color); + color: var(--table-header-text); + padding-top: 10px; + height: 30px; + vertical-align: middle; + text-align: center; } .competitor-ranking-header { @@ -49,6 +53,7 @@ .competitor-ranking-value.selected { font-weight: bold; + color: var(--focus-element) } .mat-raised-button { diff --git a/frontend/src/app/components/participant-qr-code/participant-qr-code.component.ts b/frontend/src/app/components/participant-qr-code/participant-qr-code.component.ts index 6e406cbe5..aaddf8368 100644 --- a/frontend/src/app/components/participant-qr-code/participant-qr-code.component.ts +++ b/frontend/src/app/components/participant-qr-code/participant-qr-code.component.ts @@ -5,6 +5,7 @@ import {MAT_DIALOG_DATA, MatDialogRef} from "@angular/material/dialog"; import {QrService} from "../../services/qr.service"; import {RbacService} from "../../services/rbac/rbac.service"; import {RbacActivity} from "../../services/rbac/rbac.activity"; +import {UserSessionService} from "../../services/user-session.service"; @Component({ selector: 'app-participant-qr-code', @@ -20,13 +21,13 @@ export class ParticipantQrCodeComponent implements OnInit { constructor(public dialogRef: MatDialogRef, @Optional() @Inject(MAT_DIALOG_DATA) public data: { participantId: number, port: number }, - private qrService: QrService, public rbacService: RbacService) { + private qrService: QrService, private userSessionService: UserSessionService, public rbacService: RbacService) { this.participantId = data.participantId; this.port = data.port; } ngOnInit(): void { - this.qrService.getParticipantQr(this.participantId, this.port).subscribe((_qrCode: QrCode): void => { + this.qrService.getParticipantQr(this.participantId, this.userSessionService.getNightMode(), this.port).subscribe((_qrCode: QrCode): void => { if (_qrCode) { this.qrCode = _qrCode.base64; this.link = _qrCode.link; diff --git a/frontend/src/app/components/tournament-qr-code/tournament-qr-code.component.ts b/frontend/src/app/components/tournament-qr-code/tournament-qr-code.component.ts index 5903e6c57..cda099910 100644 --- a/frontend/src/app/components/tournament-qr-code/tournament-qr-code.component.ts +++ b/frontend/src/app/components/tournament-qr-code/tournament-qr-code.component.ts @@ -6,6 +6,7 @@ import {QrService} from "../../services/qr.service"; import {QrCode} from "../../models/qr-code.model"; import {RbacActivity} from "../../services/rbac/rbac.activity"; import {RbacService} from "../../services/rbac/rbac.service"; +import {UserSessionService} from "../../services/user-session.service"; @Component({ selector: 'app-tournament-qr-code', @@ -23,13 +24,13 @@ export class TournamentQrCodeComponent implements OnInit { constructor(public dialogRef: MatDialogRef, @Optional() @Inject(MAT_DIALOG_DATA) public data: { tournament: Tournament, port: number }, - private qrService: QrService, public rbacService: RbacService) { + private qrService: QrService, private userSessionService: UserSessionService, public rbacService: RbacService) { this.tournament = data.tournament; this.port = data.port; } ngOnInit(): void { - this.qrService.getGuestsQr(this.tournament, this.port).subscribe((_qrCode: QrCode): void => { + this.qrService.getGuestsQr(this.tournament, this.userSessionService.getNightMode(), this.port).subscribe((_qrCode: QrCode): void => { if (_qrCode) { this.qrCode = _qrCode.base64; this.link = _qrCode.link; diff --git a/frontend/src/app/services/qr.service.ts b/frontend/src/app/services/qr.service.ts index 03581131e..ed3eeadf9 100644 --- a/frontend/src/app/services/qr.service.ts +++ b/frontend/src/app/services/qr.service.ts @@ -22,10 +22,10 @@ export class QrService { private systemOverloadService: SystemOverloadService) { } - getGuestsQr(tournament: Tournament, port?: number): Observable { + getGuestsQr(tournament: Tournament, nightMode: boolean, port?: number): Observable { let url: string = `${this.baseUrl}/guest/tournament/${tournament.id}`; if (port) { - url = `${this.baseUrl}/guest/tournament/${tournament.id}/port/${port}`; + url = `${this.baseUrl}/guest/tournament/${tournament.id}/port/${port}?nightMode=${nightMode}`; } return this.http.get(url) .pipe( @@ -58,10 +58,10 @@ export class QrService { ); } - getParticipantQr(participantId: number, port?: number): Observable { + getParticipantQr(participantId: number, nightMode: boolean, port?: number): Observable { let url: string = `${this.baseUrl}/participant/${participantId}/statistics`; if (port) { - url = `${this.baseUrl}/participant/${participantId}/statistics/port/${port}`; + url = `${this.baseUrl}/participant/${participantId}/statistics/port/${port}?nightMode=${nightMode}`; } return this.http.get(url) .pipe( diff --git a/frontend/src/basic-colors.scss b/frontend/src/basic-colors.scss index 34a142b0a..0fee2b1c2 100644 --- a/frontend/src/basic-colors.scss +++ b/frontend/src/basic-colors.scss @@ -27,6 +27,7 @@ --tooltip-background: #555555; --ribbon-border: #ffffff; --ribbon-background: #011d4a; + --focus-element: #00081a; } :root .dark-mode { @@ -56,5 +57,6 @@ --tooltip-background: #564f6e; --ribbon-border: #665e83; --ribbon-background: #303030; + --focus-element: #c9c5d3; }