Skip to content

Refactor input settings #907

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Jun 14, 2025
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
108 changes: 57 additions & 51 deletions backend/src/main/kotlin/hu/bme/sch/cmsch/admin/GenerateInput.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,37 +2,43 @@ package hu.bme.sch.cmsch.admin

import hu.bme.sch.cmsch.model.RoleType

const val INPUT_TYPE_TEXT = "text"
const val INPUT_TYPE_NUMBER = "number"
const val INPUT_TYPE_DATE = "date"
const val INPUT_TYPE_SQL_DATE = "sql-date"
const val INPUT_TYPE_TIME = "time"
const val INPUT_TYPE_FLOAT = "float"
const val INPUT_TYPE_FLOAT3 = "float3"
const val INPUT_TYPE_BLOCK_TEXT = "textarea"
const val INPUT_TYPE_BLOCK_TEXT_ANSWER = "textarea-answer"
const val INPUT_TYPE_BLOCK_TEXT_MARKDOWN = "markdown"
const val INPUT_TYPE_FILE = "file"
const val INPUT_TYPE_SWITCH = "checkbox"
const val INPUT_TYPE_HIDDEN = "hidden"
const val INPUT_TYPE_BLOCK_SELECT = "select"
const val INPUT_TYPE_PERMISSIONS = "permissions"
const val INPUT_TYPE_PERMISSION_GROUPS = "permission-groups"
const val INPUT_TYPE_ENTITY_SELECT = "entity-select"
const val INPUT_TYPE_LIST_ENTITIES = "list-entities"
const val INPUT_TYPE_IMAGE_PREVIEW = "image-preview"
const val INPUT_TYPE_FILE_PREVIEW = "file-preview"
const val INPUT_TYPE_FORM_EDITOR = "form-editor"
const val INPUT_TYPE_BOOLEAN_LIST = "boolean-list"
const val INPUT_TYPE_TASK_SUBMISSION_HISTORY = "task-submission-history"
const val INPUT_TYPE_SECTION_SEPARATOR = "section-separator"
const val INPUT_TYPE_DOCS = "docs"
const val INPUT_TYPE_TOKEN_QR_TEXT_FIELD = "token-qr-text-field"

const val INTERPRETER_INHERIT = "inherit"
const val INTERPRETER_PATH = "path"
const val INTERPRETER_SEARCH = "search"
const val INTERPRETER_CUSTOM = "custom"
enum class InputType(val value: String) {
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Affects a lot of files, but trivial to refactor with find and replace

TEXT("text"),
NUMBER("number"),
DATE("date"),
SQL_DATE("sql-date"),
TIME("time"),
FLOAT("float"),
FLOAT3("float3"),
BLOCK_TEXT("textarea"),
COLOR("color"),
BLOCK_TEXT_ANSWER("textarea-answer"),
BLOCK_TEXT_MARKDOWN("markdown"),
FILE("file"),
SWITCH("checkbox"),
HIDDEN("hidden"),
BLOCK_SELECT("select"),
PERMISSIONS("permissions"),
PERMISSION_GROUPS("permission-groups"),
ENTITY_SELECT("entity-select"),
LIST_ENTITIES("list-entities"),
IMAGE_PREVIEW("image-preview"),
FILE_PREVIEW("file-preview"),
FORM_EDITOR("form-editor"),
BOOLEAN_LIST("boolean-list"),
TASK_SUBMISSION_HISTORY("task-submission-history"),
SECTION_SEPARATOR("section-separator"),
DOCS("docs"),
TOKEN_QR_TEXT_FIELD("token-qr-text-field");
}

enum class InputInterpreter(val value: String) {
INHERIT("inherit"),
PATH("path"),
SEARCH("search"),
CUSTOM("custom"),
}

const val STYLE_SECURE = "secure"

Expand All @@ -41,25 +47,25 @@ const val ICON_SECURE = "encrypted"
@Retention(AnnotationRetention.RUNTIME)
@Target(AnnotationTarget.PROPERTY)
annotation class GenerateInput(
val type: String = INPUT_TYPE_TEXT,
val min: Int = 0,
val max: Int = Integer.MAX_VALUE,
val maxLength: Int = 255,
val label: String = "",
val note: String = "",
val placeholder: String = "",
val autocomplete: String = "off",
val defaultValue: String = "",
val order: Int = 0,
val visible: Boolean = true,
val enabled: Boolean = true,
val ignore: Boolean = false,
val interpreter: String = INTERPRETER_INHERIT,
val fileId: String = "0",
val fileType: String = "image",
val source: Array<String> = [],
val entitySource: String = "Nothing",
val minimumRole: RoleType = RoleType.STAFF,
val icon: String = "",
val style: String = "",
val type: InputType = InputType.TEXT,
val min: Int = 0,
val max: Int = Integer.MAX_VALUE,
val maxLength: Int = 255,
val label: String = "",
val note: String = "",
val placeholder: String = "",
val autocomplete: String = "off",
val defaultValue: String = "",
val order: Int = 0,
val visible: Boolean = true,
val enabled: Boolean = true,
val ignore: Boolean = false,
val interpreter: InputInterpreter = InputInterpreter.INHERIT,
val fileId: String = "0",
val fileType: String = "image",
val source: Array<String> = [],
val entitySource: String = "Nothing",
val minimumRole: RoleType = RoleType.STAFF,
val icon: String = "",
val style: String = "",
)
64 changes: 18 additions & 46 deletions backend/src/main/kotlin/hu/bme/sch/cmsch/admin/GenerateOverview.kt
Original file line number Diff line number Diff line change
@@ -1,13 +1,20 @@
package hu.bme.sch.cmsch.admin

const val OVERVIEW_TYPE_ID = "id"
const val OVERVIEW_TYPE_TEXT = "text"
const val OVERVIEW_TYPE_DATE = "date"
const val OVERVIEW_TYPE_BOOLEAN = "boolean"
const val OVERVIEW_TYPE_ICON = "icon"
const val OVERVIEW_TYPE_TIME = "time"
const val OVERVIEW_TYPE_NUMBER = "number"
const val OVERVIEW_TYPE_IMAGE = "image"
/**
* For sorters: https://tabulator.info/docs/5.4/sort#func-builtin
*/
enum class OverviewType(val value: String, val sorter: String, val formatSettings: Array<Pair<String, Any>>) {
ID("id", "number", arrayOf("width" to 100, "vertAlign" to "middle", "visible" to false)),
TEXT("text", "string", arrayOf("vertAlign" to "middle")),
DATE("date", "datetime", arrayOf("vertAlign" to "middle", "formatter" to "datetime")),
COLOR("color", "string", arrayOf("formatter" to "color", "width" to 20)),
BOOLEAN("boolean", "boolean", arrayOf("formatter" to "tickCross", "width" to 120)),
ICON("icon", "string", arrayOf("vertAlign" to "middle", "formatter" to "enumIconsFormatter", "width" to 120)),
TIME("time", "time", arrayOf("vertAlign" to "middle")),
NUMBER("number", "number", arrayOf("vertAlign" to "middle")),
IMAGE("image", "string", arrayOf("formatter" to "image", "width" to 120, "formatterParams" to mapOf("height" to "100px")));
}


@Retention(AnnotationRetention.RUNTIME)
@Target(AnnotationTarget.PROPERTY)
Expand All @@ -16,57 +23,22 @@ annotation class GenerateOverview(
val columnName: String = "",
val centered: Boolean = false,
val order: Int = 0,
val renderer: String = OVERVIEW_TYPE_TEXT,
val renderer: OverviewType = OverviewType.TEXT,
val useForSearch: Boolean = true
)

fun GenerateOverview.alignment(): String {
return if (this.centered) "center" else "left"
}

/**
* https://tabulator.info/docs/5.4/sort#func-builtin
*/
fun GenerateOverview.sorter(): String {
return when (this.renderer) {
OVERVIEW_TYPE_ID -> "number"
OVERVIEW_TYPE_TEXT -> "string"
OVERVIEW_TYPE_DATE -> "datetime"
OVERVIEW_TYPE_BOOLEAN -> "boolean"
OVERVIEW_TYPE_TIME -> "time"
OVERVIEW_TYPE_NUMBER -> "number"
OVERVIEW_TYPE_ICON -> "string"
else -> "string"
}
}

fun GenerateOverview.formatValue(value: Any?): Any =
if (renderer == OVERVIEW_TYPE_IMAGE) {
if (renderer == OverviewType.IMAGE) {
if (value is String && value.isNotBlank())
value
else
"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" // empty image
} else if (renderer == OVERVIEW_TYPE_TEXT || renderer == OVERVIEW_TYPE_ICON) {
} else if (renderer == OverviewType.TEXT || renderer == OverviewType.ICON ) {
value ?: ""
} else {
value ?: 0
}

fun GenerateOverview.extra(): Array<Pair<String, Any>> {
return when (this.renderer) {
OVERVIEW_TYPE_ID -> arrayOf("width" to 100, "vertAlign" to "middle", "visible" to false)
OVERVIEW_TYPE_TEXT -> arrayOf("vertAlign" to "middle")
OVERVIEW_TYPE_DATE -> arrayOf("vertAlign" to "middle", "formatter" to "datetime")
OVERVIEW_TYPE_BOOLEAN -> arrayOf("formatter" to "tickCross", "width" to 120)
OVERVIEW_TYPE_IMAGE -> arrayOf(
"formatter" to "image",
"width" to 120,
"formatterParams" to mapOf("height" to "100px")
)

OVERVIEW_TYPE_TIME -> arrayOf("vertAlign" to "middle")
OVERVIEW_TYPE_NUMBER -> arrayOf("vertAlign" to "middle")
OVERVIEW_TYPE_ICON -> arrayOf("vertAlign" to "middle", "formatter" to "enumIconsFormatter", "width" to 120)
else -> emptyArray()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,8 @@ class OverviewBuilder<T : Any>(val type: KClass<T>) {
"title" to it.second.columnName,
"field" to it.first.name,
"hozAlign" to it.second.alignment(),
"sorter" to it.second.sorter(),
*it.second.extra()
"sorter" to it.second.renderer.sorter,
*it.second.renderer.formatSettings
)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ package hu.bme.sch.cmsch.component.admission

import com.fasterxml.jackson.databind.ObjectMapper
import hu.bme.sch.cmsch.admin.GenerateOverview
import hu.bme.sch.cmsch.admin.OVERVIEW_TYPE_ID
import hu.bme.sch.cmsch.admin.OverviewType
import hu.bme.sch.cmsch.component.form.FormRepository
import hu.bme.sch.cmsch.controller.admin.ControlAction
import hu.bme.sch.cmsch.controller.admin.SimpleEntityPage
Expand All @@ -29,7 +29,7 @@ import java.util.*

data class AdmissionFormEntry(

@property:GenerateOverview(renderer = OVERVIEW_TYPE_ID, columnName = "ID", order = -1)
@property:GenerateOverview(renderer = OverviewType.ID, columnName = "ID", order = -1)
override var id: Int = 0,

@property:GenerateOverview(columnName = "Form neve", order = 1)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,8 @@ data class AdmissionEntryEntity(
@GeneratedValue
@field:JsonView(value = [ Edit::class ])
@Column(nullable = false)
@property:GenerateInput(type = INPUT_TYPE_HIDDEN, visible = true, ignore = true)
@property:GenerateOverview(renderer = OVERVIEW_TYPE_ID, columnName = "ID", order = -1)
@property:GenerateInput(type = InputType.HIDDEN, visible = true, ignore = true)
@property:GenerateOverview(renderer = OverviewType.ID, columnName = "ID", order = -1)
override var id: Int = 0,

@field:JsonView(value = [ Edit::class, Preview::class, FullDetails::class ])
Expand All @@ -37,28 +37,28 @@ data class AdmissionEntryEntity(

@Column(nullable = false)
@field:JsonView(value = [ Edit::class ])
@property:GenerateInput(type = INPUT_TYPE_NUMBER, order = 2, label = "Felhasználó ID-je", min = 0, defaultValue = "0")
@property:GenerateInput(type = InputType.NUMBER, order = 2, label = "Felhasználó ID-je", min = 0, defaultValue = "0")
@property:GenerateOverview(visible = false)
@property:ImportFormat
var userId: Int = 0,

@Column(nullable = false)
@field:JsonView(value = [ Edit::class ])
@property:GenerateInput(type = INPUT_TYPE_DATE, order = 4, label = "Időbélyeg", min = 0, defaultValue = "0")
@property:GenerateOverview(columnName = "Frissült", order = 3, renderer = OVERVIEW_TYPE_DATE, centered = true)
@property:GenerateInput(type = InputType.DATE, order = 4, label = "Időbélyeg", min = 0, defaultValue = "0")
@property:GenerateOverview(columnName = "Frissült", order = 3, renderer = OverviewType.DATE, centered = true)
@property:ImportFormat
var timestamp: Long = 0L,

@Column(nullable = false)
@field:JsonView(value = [ Edit::class ])
@property:GenerateInput(type = INPUT_TYPE_NUMBER, order = 4, label = "Űrlap ID-je", min = 0, defaultValue = "0")
@property:GenerateInput(type = InputType.NUMBER, order = 4, label = "Űrlap ID-je", min = 0, defaultValue = "0")
@property:GenerateOverview(visible = false)
@property:ImportFormat
var formId: Int = 0,

@Column(nullable = false)
@field:JsonView(value = [ Edit::class ])
@property:GenerateInput(type = INPUT_TYPE_NUMBER, order = 5, label = "Beadás ID-je", min = 0, defaultValue = "0")
@property:GenerateInput(type = InputType.NUMBER, order = 5, label = "Beadás ID-je", min = 0, defaultValue = "0")
@property:GenerateOverview(visible = false)
@property:ImportFormat
var responseId: Int = 0,
Expand All @@ -67,7 +67,7 @@ data class AdmissionEntryEntity(
@JdbcTypeCode(SqlTypes.VARCHAR)
@Column(nullable = false)
@field:JsonView(value = [ Edit::class ])
@property:GenerateInput(type = INPUT_TYPE_BLOCK_SELECT, order = 6,
@property:GenerateInput(type = InputType.BLOCK_SELECT, order = 6,
label = "Belépési jogosultság",
source = [ "BANNED", "CANNOT_ATTEND", "USER", "ORGANIZER", "VIP", "PERFORMER", "LEAD_ORGANIZER" ])
@property:GenerateOverview(visible = false)
Expand All @@ -76,8 +76,8 @@ data class AdmissionEntryEntity(

@field:JsonView(value = [ Edit::class ])
@Column(nullable = false)
@property:GenerateInput(type = INPUT_TYPE_SWITCH, order = 7, label = "Beengedés engedélyezve")
@property:GenerateOverview(columnName = "Engedélyezve", order = 2, centered = true, renderer = OVERVIEW_TYPE_BOOLEAN)
@property:GenerateInput(type = InputType.SWITCH, order = 7, label = "Beengedés engedélyezve")
@property:GenerateOverview(columnName = "Engedélyezve", order = 2, centered = true, renderer = OverviewType.BOOLEAN)
@property:ImportFormat
var allowed: Boolean = false,

Expand All @@ -97,7 +97,7 @@ data class AdmissionEntryEntity(

@Column(nullable = false)
@field:JsonView(value = [ Edit::class ])
@property:GenerateInput(type = INPUT_TYPE_NUMBER, order = 10, label = "Beléptető ID-je", min = 0, defaultValue = "0")
@property:GenerateInput(type = InputType.NUMBER, order = 10, label = "Beléptető ID-je", min = 0, defaultValue = "0")
@property:GenerateOverview(visible = false)
@property:ImportFormat
var gateUserId: Int = 0,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,8 @@ data class TicketEntity(
@GeneratedValue
@field:JsonView(value = [ Edit::class ])
@Column(nullable = false)
@property:GenerateInput(type = INPUT_TYPE_HIDDEN, visible = true, ignore = true)
@property:GenerateOverview(renderer = OVERVIEW_TYPE_ID, columnName = "ID", order = -1)
@property:GenerateInput(type = InputType.HIDDEN, visible = true, ignore = true)
@property:GenerateOverview(renderer = OverviewType.ID, columnName = "ID", order = -1)
override var id: Int = 0,

@field:JsonView(value = [ Edit::class, Preview::class, FullDetails::class ])
Expand All @@ -43,7 +43,7 @@ data class TicketEntity(

@field:JsonView(value = [ Edit::class ])
@Column(nullable = false)
@property:GenerateInput(type = INPUT_TYPE_SWITCH, order = 3, label = "Profil QR kód használata")
@property:GenerateInput(type = InputType.SWITCH, order = 3, label = "Profil QR kód használata")
@property:GenerateOverview(visible = false)
@property:ImportFormat
var useCmschId: Boolean = false,
Expand All @@ -59,7 +59,7 @@ data class TicketEntity(
@JdbcTypeCode(SqlTypes.VARCHAR)
@Column(nullable = false)
@field:JsonView(value = [ Edit::class ])
@property:GenerateInput(type = INPUT_TYPE_BLOCK_SELECT, order = 5,
@property:GenerateInput(type = InputType.BLOCK_SELECT, order = 5,
label = "Belépési jogosultság",
source = [ "BANNED", "CANNOT_ATTEND", "USER", "ORGANIZER", "VIP", "PERFORMER", "LEAD_ORGANIZER" ])
@property:GenerateOverview(visible = false)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -129,7 +129,7 @@ class ApplicationComponent(
)

val adminBrandColor = SettingProxy(componentSettingService, component,
"adminBrandColor", "#00F460", type = SettingType.TEXT, serverSideOnly = true,
"adminBrandColor", "#00F460", type = SettingType.COLOR, serverSideOnly = true,
fieldName = "Admin menü színe", description = "Ez lesz az admin oldal színe"
)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@ data class ExtraMenuEntity(
@Id
@GeneratedValue
@Column(nullable = false)
@property:GenerateInput(type = INPUT_TYPE_HIDDEN, visible = true, ignore = true)
@property:GenerateOverview(renderer = OVERVIEW_TYPE_ID, columnName = "ID", order = -1)
@property:GenerateInput(type = InputType.HIDDEN, visible = true, ignore = true)
@property:GenerateOverview(renderer = OverviewType.ID, columnName = "ID", order = -1)
override var id: Int = 0,

@Column(nullable = false)
Expand All @@ -30,7 +30,7 @@ data class ExtraMenuEntity(
var url: String = "",

@Column(nullable = false)
@property:GenerateInput(type = INPUT_TYPE_SWITCH, order = 3, label = "Külső hivatkozás", note = "A menü külső címre továbbítson-e át")
@property:GenerateInput(type = InputType.SWITCH, order = 3, label = "Külső hivatkozás", note = "A menü külső címre továbbítson-e át")
@property:GenerateOverview(visible = false)
var external: Boolean = false,

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@ import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.dataformat.csv.CsvMapper
import com.fasterxml.jackson.dataformat.csv.CsvSchema
import hu.bme.sch.cmsch.admin.GenerateOverview
import hu.bme.sch.cmsch.admin.OVERVIEW_TYPE_ID
import hu.bme.sch.cmsch.admin.OverviewBuilder
import hu.bme.sch.cmsch.admin.OverviewType
import hu.bme.sch.cmsch.controller.admin.ButtonAction
import hu.bme.sch.cmsch.controller.admin.ControlAction
import hu.bme.sch.cmsch.model.IdentifiableEntity
Expand Down Expand Up @@ -263,7 +263,7 @@ class MenuAdminController(
}

class MenuSetupByRoleVirtualEntity(
@property:GenerateOverview(renderer = OVERVIEW_TYPE_ID, columnName = "ID", order = -1)
@property:GenerateOverview(renderer = OverviewType.ID, columnName = "ID", order = -1)
override var id: Int = 0,

@property:GenerateOverview(columnName = "Role", order = 1)
Expand Down
Loading
Loading