Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import org.springframework.web.bind.annotation.PostMapping
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RequestParam
import org.springframework.web.servlet.mvc.support.RedirectAttributes
import trik.testsys.webclient.service.LogoService
import trik.testsys.webclient.service.security.login.impl.LoginData
import trik.testsys.webclient.service.security.login.impl.LoginProcessor
import trik.testsys.webclient.util.addInvalidAccessTokenMessage
Expand All @@ -20,12 +21,18 @@ import trik.testsys.webclient.util.addSessionActiveInfo
@RequestMapping("/login")
class LoginController(
private val loginData: LoginData,
private val loginProcessor: LoginProcessor
private val loginProcessor: LoginProcessor,

private val logoService: LogoService
) {

@GetMapping
fun loginGet(model: Model): String {
loginData.accessToken?.let { model.addSessionActiveInfo() }

val logos = logoService.getLogos()
model.addAttribute("logos", logos)

return LOGIN_PAGE
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import org.springframework.stereotype.Controller
import org.springframework.ui.Model
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.RequestMapping
import trik.testsys.webclient.service.LogoService
import trik.testsys.webclient.service.security.login.impl.LoginData
import trik.testsys.webclient.util.addSessionActiveInfo

Expand All @@ -14,13 +15,17 @@ import trik.testsys.webclient.util.addSessionActiveInfo
@Controller
@RequestMapping(MainController.MAIN_PATH)
class MainController(
private val loginData: LoginData
private val loginData: LoginData,
private val logoService: LogoService
) {

@GetMapping
fun mainGet(model: Model): String {
loginData.accessToken?.let { model.addSessionActiveInfo() }

val logos = logoService.getLogos()
model.addAttribute("logos", logos)

return MAIN_PAGE
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import org.springframework.web.bind.annotation.RequestParam
import org.springframework.web.servlet.View
import org.springframework.web.servlet.mvc.support.RedirectAttributes
import trik.testsys.core.entity.user.UserEntity
import trik.testsys.webclient.service.LogoService
import trik.testsys.webclient.service.entity.RegEntityService
import trik.testsys.webclient.service.security.login.impl.LoginData
import trik.testsys.webclient.util.addPopupMessage
Expand All @@ -25,14 +26,20 @@ import javax.servlet.http.HttpServletRequest
@RequestMapping(RegistrationController.REGISTRATION_PATH)
class RegistrationController(
context: ApplicationContext,
private val loginData: LoginData
private val loginData: LoginData,

private val logoService: LogoService
) {

private val registrationServices = context.getBeansOfType(RegEntityService::class.java).values

@GetMapping
fun registrationGet(model: Model): String {
loginData.accessToken?.let { model.addSessionActiveInfo() }

val logos = logoService.getLogos()
model.addAttribute("logos", logos)

return REGISTRATION_PAGE
}

Expand Down
14 changes: 14 additions & 0 deletions src/main/kotlin/trik/testsys/webclient/service/LogoService.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package trik.testsys.webclient.service

import trik.testsys.webclient.view.impl.LogosView

/**
* Service for logos management.
*
* @author Roman Shishkin
* @since %CURRENT_VERSION%
*/
interface LogoService {

fun getLogos(): LogosView
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package trik.testsys.webclient.service.impl

import org.slf4j.LoggerFactory
import org.springframework.beans.factory.annotation.Value
import org.springframework.stereotype.Service
import trik.testsys.webclient.service.LogoService
import trik.testsys.webclient.view.impl.LogosView
import java.io.File

/**
* @author Roman Shishkin
* @since %CURRENT_VERSION%
*/
@Service
class LogoServiceImpl(
@Value("\${path.logos.sponsor}") private val sponsorLogosPath: String,
@Value("\${path.logos.main}") private val mainLogoFilePath: String,
) : LogoService {

private val sponsorLogosDir = File(sponsorLogosPath)
private val mainLogo = File(mainLogoFilePath)

init {
if (!sponsorLogosDir.exists() || !sponsorLogosDir.isDirectory) {
logger.warn("Sponsor logos directory not found: $sponsorLogosPath. Creating...")
sponsorLogosDir.mkdirs()
}

if (!mainLogo.exists() || !mainLogo.isFile) {
logger.warn("Main logo file not found: $mainLogoFilePath")
}
}

override fun getLogos(): LogosView {
val builder = LogosView.builder()

sponsorLogosDir.listFiles()
?.filter { it.isFile }
?.forEach { builder.addSponsorLogo(it.path) }

mainLogo.takeIf { it.exists() }?.let { builder.addMainLogo(it.path) }

return builder.build()
}

companion object {

private val logger = LoggerFactory.getLogger(LogoServiceImpl::class.java)
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package trik.testsys.webclient.util.config

import org.springframework.beans.factory.annotation.Value
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
import org.springframework.context.annotation.EnableAspectJAutoProxy
Expand All @@ -19,7 +20,10 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurer
@EnableScheduling
@EnableAspectJAutoProxy
@EnableWebMvc
class Configuration : WebMvcConfigurer {
class Configuration(
@Value("\${path.logos.sponsor}") private val sponsorLogosPath: String,
@Value("\${path.logos.main}") private val mainLogoFilePath: String
) : WebMvcConfigurer {

override fun addResourceHandlers(registry: ResourceHandlerRegistry) {
registry.addResourceHandler(
Expand All @@ -31,7 +35,9 @@ class Configuration : WebMvcConfigurer {
"classpath:/static/img/",
"classpath:/static/css/",
"classpath:/static/js/",
"classpath:/static/assets/"
"classpath:/static/assets/",
"file:$sponsorLogosPath/",
"file:$mainLogoFilePath"
)
}

Expand Down
42 changes: 42 additions & 0 deletions src/main/kotlin/trik/testsys/webclient/view/impl/LogosView.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package trik.testsys.webclient.view.impl

/**
* View for sponsor logos.
*
* @author Roman Shishkin
* @since %CURRENT_VERSION%
*/
data class LogosView(
val hasSponsors: Boolean = false,
val hasMain: Boolean = false,
val sponsorLogos: List<LogoView>? = null,
val mainLogo: LogoView? = null
) {

data class LogoView(val path: String, val name: String = path.substringAfterLast('/'))

class Builder {

private var sponsorLogos: MutableList<LogoView> = mutableListOf()
private var mainLogo: LogoView? = null

fun addSponsorLogo(path: String) = apply { sponsorLogos.add(LogoView(path)) }

fun addMainLogo(path: String) = apply { mainLogo = LogoView(path) }

fun build(): LogosView {
return LogosView(
hasSponsors = sponsorLogos.isNotEmpty(),
hasMain = mainLogo != null,
sponsorLogos,
mainLogo)
}
}

companion object {

fun empty() = LogosView()

fun builder() = Builder()
}
}
3 changes: 3 additions & 0 deletions src/main/resources/application.yml
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,9 @@ path:
verdicts: "${PWD}/data/files/verdicts/"
recordings: "${PWD}/data/files/recordings/"
results: "${PWD}/data/files/results/"
logos:
sponsor: "${PWD}/data/logos/sponsor/"
main: "${PWD}/data/logos/main.png"

trik-studio-version: "${TRIK_STUDIO_VERSION:latest}"
grading-node-addresses: "${GRADING_NODE_ADDRESSES:}"
Expand Down
25 changes: 25 additions & 0 deletions src/main/resources/static/css/modal.css
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
background-repeat: no-repeat;
background-size: 50%;
background-position: center;
flex-direction: column;
}

/* Окно (модальное) */
Expand Down Expand Up @@ -75,3 +76,27 @@
transform: scale(1);
}
}

.main-logo {
margin: 10px 0;
height: 120px;
}

.main-logo img {
height: 100%;
}

.sponsor-logos {
display: flex;
justify-content: center;
gap: 20px;
margin: 10px 0;
height: 120px;
width: auto;
}

.sponsor-logos img {
height: 100%;
object-fit: contain;
margin: auto;
}
18 changes: 18 additions & 0 deletions src/main/resources/templates/fragments/main.html
Original file line number Diff line number Diff line change
Expand Up @@ -23,4 +23,22 @@
<!--Background for every page-->
<div th:fragment="background" class="background-container"></div>

<!--/*@thymesVar id="logos" type="trik.testsys.webclient.view.impl.LogosView"*/-->
<div th:fragment="main-logo">
<div class="main-logo modal" th:style="${logos.hasMain} ? '' : 'display: none;'">
<img th:if="${logos.hasMain}"
th:src="@{|/img/${logos.mainLogo.name}|}"
alt="Main logo"/>
</div>
</div>

<!--/*@thymesVar id="logos" type="trik.testsys.webclient.view.impl.LogosView"*/-->
<div th:fragment="sponsor-logos">
<div class="sponsor-logos modal" th:style="${logos.hasSponsors} ? '' : 'display: none;'">
<img th:each="sponsor : ${logos.sponsorLogos}"
th:src="@{|/img/${sponsor.name}|}"
alt="Sponsor logo"/>
</div>
</div>

</html>
4 changes: 4 additions & 0 deletions src/main/resources/templates/login.html
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@
<div th:replace="fragments/popup :: popup"></div>

<div class="modal-container">
<div th:replace="fragments/main :: main-logo"></div>

<div class="modal">
<div class="modal-header">
<h1>Вход в личный кабинет TestSys</h1>
Expand Down Expand Up @@ -43,6 +45,8 @@ <h1>Вход в личный кабинет TestSys</h1>
</a>
</div>
</div>

<div th:replace="fragments/main :: sponsor-logos"></div>
</div>

</body>
Expand Down
4 changes: 4 additions & 0 deletions src/main/resources/templates/main.html
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@
<div th:replace="fragments/popup :: popup"></div>

<div class="modal-container">
<div th:replace="fragments/main :: main-logo"></div>

<div class="modal">
<div class="modal-header">
<h1>Тестирующая система TestSys</h1>
Expand All @@ -26,6 +28,8 @@ <h1>Тестирующая система TestSys</h1>
class="button">Вернуться в активную сессию</a>
</div>
</div>

<div th:replace="fragments/main :: sponsor-logos"></div>
</div>

</body>
Expand Down
4 changes: 4 additions & 0 deletions src/main/resources/templates/registration.html
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@
<div th:replace="fragments/popup :: popup"></div>

<div class="modal-container">
<div th:replace="fragments/main :: main-logo"></div>

<div class="modal">
<div class="modal-header">
<h1>Регистрация в TestSys</h1>
Expand Down Expand Up @@ -43,6 +45,8 @@ <h1>Регистрация в TestSys</h1>
class="button">Вернуться в активную сессию</a>
</div>
</div>

<div th:replace="fragments/main :: sponsor-logos"></div>
</div>

</body>
Expand Down