Skip to content
Open
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 @@ -6,11 +6,11 @@ package hu.bme.sch.cmsch.admin
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")),
DATE("date", "number", arrayOf("vertAlign" to "middle", "formatter" to "datetime")),
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Look at how DATE/datetime columns are wired on the frontend side and whether
# any formatterParams / inputFormat is supplied for Tabulator.
fd -t f -e ts -e tsx -e js -e jsx | xargs rg -nP -C3 '\b(Tabulator|formatter\s*[:=]\s*["'\'']datetime|inputFormat)\b' 2>/dev/null

Repository: kir-dev/cmsch

Length of output: 50370


🌐 Web query:

Tabulator datetime formatter unix timestamp inputFormat formatterParams

💡 Result:

The Tabulator "datetime" formatter does not natively support Unix timestamps via inputFormat. Official docs for versions up to 6.4 show inputFormat expects Luxon format strings (e.g., "yyyy-MM-dd HH:mm") or "iso", but no "unix" option. In older versions using Moment.js (pre-5.0), "unix" worked unofficially due to Moment's flexible parsing of the 'x' token, but Luxon requires DateTime.fromMillis(value) for milliseconds since Unix epoch. Use a custom formatter function for Unix timestamps (assumed milliseconds; multiply by 1000 if seconds): { title: "Time", field: "timestamp", formatter: function(cell, formatterParams) { const value = cell.getValue; const dt = luxon.DateTime.fromMillis(value); return dt.isValid ? dt.toFormat(formatterParams.outputFormat || "yyyy-MM-dd HH:mm") : (formatterParams.invalidPlaceholder || "(invalid date)"); }, formatterParams: { outputFormat: "DD/MM/YY HH:mm", invalidPlaceholder: "(invalid date)" } } Include luxon.js before Tabulator. Ensure luxon.DateTime is globally available (e.g., window.DateTime = luxon.DateTime if using modules). This approach is confirmed in Stack Overflow discussions and GitHub issues for Tabulator 5.x+; no built-in Unix support in recent docs (6.4).

Citations:


🏁 Script executed:

# Find frontend files that might configure Tabulator columns
find . -type f \( -name "*.ts" -o -name "*.tsx" -o -name "*.js" -o -name "*.jsx" \) -path "*/frontend/*" -o -path "*/src/main/resources/static/*" | head -20

Repository: kir-dev/cmsch

Length of output: 1159


🏁 Script executed:

# Search for column configurations that reference "DATE" or Tabulator column definitions
rg -i "column.*datetime|formatter.*datetime|DATE.*column" --type ts --type tsx --type js --type jsx -A 5 2>/dev/null | head -100

Repository: kir-dev/cmsch

Length of output: 39


🏁 Script executed:

# Look for where the column definitions from the backend are used in the frontend
rg -i "formatvalue|sorter|formatter" --type ts --type tsx --type js --type jsx -B 2 -A 2 2>/dev/null | head -150

Repository: kir-dev/cmsch

Length of output: 39


🏁 Script executed:

# Check if admin-script-4.js exists and read it
wc -l backend/src/main/resources/static/js/admin-script-4.js

Repository: kir-dev/cmsch

Length of output: 116


🏁 Script executed:

# Search for column configuration or formatter references in static JS files
rg "formatter|inputFormat|formatValue|datetime" backend/src/main/resources/static/js/ -A 3 -B 1 2>/dev/null | head -200

Repository: kir-dev/cmsch

Length of output: 50370


🏁 Script executed:

# Look for how the column array from backend is used in the frontend
rg -i "columns\s*[:=]|addColumn|setColumns" backend/src/main/resources/static/js/ 2>/dev/null | head -50

Repository: kir-dev/cmsch

Length of output: 50370


🏁 Script executed:

cat -n backend/src/main/resources/static/js/admin-script-4.js

Repository: kir-dev/cmsch

Length of output: 10877


🏁 Script executed:

find backend/src/main/resources -name "*.html" -o -name "*.ftl" | head -20

Repository: kir-dev/cmsch

Length of output: 1485


🏁 Script executed:

# Search for where Tabulator is used with columns
rg -i "new Tabulator|setColumns|tabulator" backend/src/main/resources/ -l 2>/dev/null | head -10

Repository: kir-dev/cmsch

Length of output: 313


🏁 Script executed:

# Search specifically in template files for column or formatter references
rg -i "formatter.*datetime|columns.*date" backend/src/main/resources/ -B 2 -A 2 2>/dev/null | head -100

Repository: kir-dev/cmsch

Length of output: 50370


🏁 Script executed:

grep -n "timestampFormatter\|function timestampFormatter" backend/src/main/resources/templates/overview4.html -A 15 | head -60

Repository: kir-dev/cmsch

Length of output: 1518


🏁 Script executed:

# Check if there's any documentation or comments about the timestamp format
grep -n "Long\|timestamp\|millisecond\|second" backend/src/main/kotlin/hu/bme/sch/cmsch/admin/GenerateOverview.kt | head -20

Repository: kir-dev/cmsch

Length of output: 39


🏁 Script executed:

# Look for how dates are stored/formatted elsewhere in the codebase
rg "DateTime\.|System.currentTimeMillis\|Instant\." backend/src/main/kotlin/hu/bme/sch/cmsch/ --type kotlin -B 2 -A 2 | head -80

Repository: kir-dev/cmsch

Length of output: 2961


🏁 Script executed:

# Search for how DATE fields are populated in the data
rg "formatValue.*DATE\|case DATE\|\"date\"" backend/src/main/kotlin/hu/bme/sch/cmsch/admin/ -B 3 -A 3 | head -60

Repository: kir-dev/cmsch

Length of output: 39


🏁 Script executed:

# Check the OverviewField and how values are formatted
rg "enum class OverviewField\|formatValue" backend/src/main/kotlin/hu/bme/sch/cmsch/admin/GenerateOverview.kt -B 2 -A 5 | head -80

Repository: kir-dev/cmsch

Length of output: 39


🏁 Script executed:

# Let me read the GenerateOverview.kt file directly to see formatValue and DATE handling
sed -n '1,100p' backend/src/main/kotlin/hu/bme/sch/cmsch/admin/GenerateOverview.kt

Repository: kir-dev/cmsch

Length of output: 1905


🏁 Script executed:

# Check the entire file for the formatValue and DATE sections
grep -n "formatValue\|enum class\|DATE\(" backend/src/main/kotlin/hu/bme/sch/cmsch/admin/GenerateOverview.kt | head -30

Repository: kir-dev/cmsch

Length of output: 81


Sorting is fixed, but verify the timestamp units match between backend and frontend formatter.

The change to sorter="number" correctly fixes sorting for the DATE column. However, formatValue passes raw Long values unchanged (value ?: 0), and the frontend uses a custom timestampFormatter that expects values in seconds (luxon.DateTime.fromSeconds(value)). If the backend sends timestamps in milliseconds instead, dates will render incorrectly despite sorting working. Confirm that all DATE field values are populated in seconds, not milliseconds, to avoid display issues.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@backend/src/main/kotlin/hu/bme/sch/cmsch/admin/GenerateOverview.kt` at line
9, The DATE column currently uses sorter="number" but formatValue passes the raw
Long (value ?: 0) which may be in milliseconds while the frontend
timestampFormatter (luxon.DateTime.fromSeconds) expects seconds; update the
backend to ensure DATE field values are seconds—either by converting
milliseconds to seconds (divide by 1000) inside the formatValue path for the
DATE enum entry or ensure the source that populates DATE already emits seconds;
locate the DATE enum entry and the formatValue handling around it in
GenerateOverview.kt and add the conversion/validation so the frontend receives
seconds-consistent timestamps.

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")),
TIME("time", "number", 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")));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ data class ChallengeSubmissionEntity(
@Column(nullable = false)
@field:JsonView(value = [ Edit::class ])
@property:GenerateInput(type = InputType.NUMBER, min = Integer.MIN_VALUE, order = 4, label = "Adott pont")
@property:GenerateOverview(columnName = "Pont", order = 5, centered = true)
@property:GenerateOverview(renderer = OverviewType.NUMBER, columnName = "Pont", order = 5, centered = true)
@property:ImportFormat
var score: Int = 0,

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,10 @@ data class TinderCommunityVirtualEntity(
@property:GenerateOverview(columnName = "Név", order = 1)
val name: String,

@property:GenerateOverview(columnName = "Jobbra húzva", order = 2)
@property:GenerateOverview(renderer = OverviewType.NUMBER, columnName = "Jobbra húzva", order = 2)
val likes: Int,

@property:GenerateOverview(columnName = "Balra húzva", order = 3)
@property:GenerateOverview(renderer = OverviewType.NUMBER, columnName = "Balra húzva", order = 3)
val dislikes: Int,

) : IdentifiableEntity
Original file line number Diff line number Diff line change
Expand Up @@ -12,13 +12,13 @@ data class DebtsByGroupVirtualEntity(
@property:GenerateOverview(columnName = "Csoport", order = 1)
var groupName: String = "",

@property:GenerateOverview(columnName = "Forgalom [JMF]", order = 2, centered = true)
@property:GenerateOverview(renderer = OverviewType.NUMBER, columnName = "Forgalom [JMF]", order = 2, centered = true)
var total: Int = 0,

@property:GenerateOverview(columnName = "Fizetetlen [JMF]", order = 3, centered = true)
@property:GenerateOverview(renderer = OverviewType.NUMBER, columnName = "Fizetetlen [JMF]", order = 3, centered = true)
var notPayed: Int = 0,

@property:GenerateOverview(columnName = "Lezáratlan [JMF]", order = 4, centered = true)
@property:GenerateOverview(renderer = OverviewType.NUMBER, columnName = "Lezáratlan [JMF]", order = 4, centered = true)
var notFinished: Int = 0

) : IdentifiableEntity
Original file line number Diff line number Diff line change
Expand Up @@ -15,13 +15,13 @@ data class DebtsByUserVirtualEntity(
@property:GenerateOverview(columnName = "Csoport", order = 2, centered = true)
var groupName: String = "",

@property:GenerateOverview(columnName = "Totál [JMF]", order = 3, centered = true)
@property:GenerateOverview(renderer = OverviewType.NUMBER, columnName = "Totál [JMF]", order = 3, centered = true)
var total: Int = 0,

@property:GenerateOverview(columnName = "Fizetetlen [JMF]", order = 4, centered = true)
@property:GenerateOverview(renderer = OverviewType.NUMBER, columnName = "Fizetetlen [JMF]", order = 4, centered = true)
var notPayed: Int = 0,

@property:GenerateOverview(columnName = "Lezáratlan [JMF]", order = 5, centered = true)
@property:GenerateOverview(renderer = OverviewType.NUMBER, columnName = "Lezáratlan [JMF]", order = 5, centered = true)
var notFinished: Int = 0

) : IdentifiableEntity
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ data class ProductEntity(
@Column(nullable = false)
@field:JsonView(value = [ Edit::class, Preview::class, FullDetails::class ])
@property:GenerateInput(type = InputType.NUMBER, order = 2, label = "Ár", min = 1, defaultValue = "100", note = "JMF-ben természetesen")
@property:GenerateOverview(columnName = "Ár", order = 1, centered = true)
@property:GenerateOverview(renderer = OverviewType.NUMBER, columnName = "Ár", order = 1, centered = true)
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

LGTM on the renderer change; unrelated pre-existing order collision worth noting.

The added renderer = OverviewType.NUMBER is correct. Unrelated to this diff: price (line 48) and name (line 41) both use order = 1, which can cause non-deterministic column ordering in the overview. Pre-existing — feel free to address separately if intentional ordering is desired.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@backend/src/main/kotlin/hu/bme/sch/cmsch/component/debt/ProductEntity.kt` at
line 48, The GenerateOverview annotation on the price property now correctly
sets renderer = OverviewType.NUMBER but there is an order collision: both the
price property and the name property use order = 1; update one of the
annotations (the `@property`:GenerateOverview on either the price or name property
in ProductEntity) to a unique order value to ensure deterministic column
ordering in the overview, e.g., increment one of the order values so each column
has a distinct order.

@property:ImportFormat
var price: Int = 0,

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ data class SoldProductEntity(
@Column(nullable = false)
@field:JsonView(value = [ Edit::class, FullDetails::class ])
@property:GenerateInput(order = 2, label = "Ár", enabled = false, ignore = true, note = "Az árak JMF-ben értendőek")
@property:GenerateOverview(columnName = "Ár", order = 2)
@property:GenerateOverview(renderer = OverviewType.NUMBER, columnName = "Ár", order = 2)
@property:ImportFormat
var price: Int = 0,

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,19 +12,19 @@ data class FormVirtualEntity(
@property:GenerateOverview(columnName = "Cím", order = 1)
val name: String,

@property:GenerateOverview(columnName = "Limit", order = 2)
@property:GenerateOverview(renderer = OverviewType.NUMBER, columnName = "Limit", order = 2)
val limit: Int,

@property:GenerateOverview(columnName = "Beküldött", order = 3)
@property:GenerateOverview(renderer = OverviewType.NUMBER, columnName = "Beküldött", order = 3)
val submitted: Int,

@property:GenerateOverview(columnName = "Fizetve", order = 4)
@property:GenerateOverview(renderer = OverviewType.NUMBER, columnName = "Fizetve", order = 4)
val accepted: Int,

@property:GenerateOverview(columnName = "Visszautasított", order = 5)
@property:GenerateOverview(renderer = OverviewType.NUMBER, columnName = "Visszautasított", order = 5)
val rejected: Int,

@property:GenerateOverview(columnName = "Elfogadva", order = 6)
@property:GenerateOverview(renderer = OverviewType.NUMBER, columnName = "Elfogadva", order = 6)
val validated: Int,

) : IdentifiableEntity
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package hu.bme.sch.cmsch.component.leaderboard
import com.fasterxml.jackson.annotation.JsonView
import hu.bme.sch.cmsch.admin.GenerateOverview
import hu.bme.sch.cmsch.admin.ImportFormat
import hu.bme.sch.cmsch.admin.OverviewType
import hu.bme.sch.cmsch.dto.FullDetails
import hu.bme.sch.cmsch.dto.Preview
import hu.bme.sch.cmsch.model.IdentifiableEntity
Expand All @@ -19,27 +20,27 @@ data class LeaderBoardAsGroupEntryDto(
override var name: String = "",

@field:JsonView(value = [ Preview::class, FullDetails::class ])
@property:GenerateOverview(columnName = "Feladatok", order = 2, centered = true)
@property:GenerateOverview(renderer = OverviewType.NUMBER, columnName = "Feladatok", order = 2, centered = true)
@property:ImportFormat
override var taskScore: Int = 0,

@field:JsonView(value = [ Preview::class, FullDetails::class ])
@property:GenerateOverview(columnName = "Riddleök", order = 3, centered = true)
@property:GenerateOverview(renderer = OverviewType.NUMBER, columnName = "Riddleök", order = 3, centered = true)
@property:ImportFormat
override var riddleScore: Int = 0,

@field:JsonView(value = [ Preview::class, FullDetails::class ])
@property:GenerateOverview(columnName = "Beadások", order = 4, centered = true)
@property:GenerateOverview(renderer = OverviewType.NUMBER, columnName = "Beadások", order = 4, centered = true)
@property:ImportFormat
override var challengeScore: Int = 0,

@field:JsonView(value = [ Preview::class, FullDetails::class ])
@property:GenerateOverview(columnName = "QR Kódok", order = 5, centered = true)
@property:GenerateOverview(renderer = OverviewType.NUMBER, columnName = "QR Kódok", order = 5, centered = true)
@property:ImportFormat
override var tokenScore: Int = 0,

@field:JsonView(value = [ Preview::class, FullDetails::class ])
@property:GenerateOverview(columnName = "Totál", order = 100, centered = true)
@property:GenerateOverview(renderer = OverviewType.NUMBER, columnName = "Totál", order = 100, centered = true)
@property:ImportFormat
override var totalScore: Int = 0,

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package hu.bme.sch.cmsch.component.leaderboard
import com.fasterxml.jackson.annotation.JsonView
import hu.bme.sch.cmsch.admin.GenerateOverview
import hu.bme.sch.cmsch.admin.ImportFormat
import hu.bme.sch.cmsch.admin.OverviewType
import hu.bme.sch.cmsch.dto.FullDetails
import hu.bme.sch.cmsch.dto.Preview
import hu.bme.sch.cmsch.model.IdentifiableEntity
Expand All @@ -24,27 +25,27 @@ data class LeaderBoardAsUserEntryDto(
var groupName: String = "",

@field:JsonView(value = [ Preview::class, FullDetails::class ])
@property:GenerateOverview(columnName = "Feladatok", order = 3, centered = true)
@property:GenerateOverview(renderer = OverviewType.NUMBER, columnName = "Feladatok", order = 3, centered = true)
@property:ImportFormat
override var taskScore: Int = 0,

@field:JsonView(value = [ Preview::class, FullDetails::class ])
@property:GenerateOverview(columnName = "Riddleök", order = 4, centered = true)
@property:GenerateOverview(renderer = OverviewType.NUMBER, columnName = "Riddleök", order = 4, centered = true)
@property:ImportFormat
override var riddleScore: Int = 0,

@field:JsonView(value = [ Preview::class, FullDetails::class ])
@property:GenerateOverview(columnName = "Beadások", order = 5, centered = true)
@property:GenerateOverview(renderer = OverviewType.NUMBER, columnName = "Beadások", order = 5, centered = true)
@property:ImportFormat
override var challengeScore: Int = 0,

@field:JsonView(value = [Preview::class, FullDetails::class])
@property:GenerateOverview(columnName = "QR Kódok", order = 6, centered = true)
@property:GenerateOverview(renderer = OverviewType.NUMBER, columnName = "QR Kódok", order = 6, centered = true)
@property:ImportFormat
override var tokenScore: Int = 0,

@field:JsonView(value = [ Preview::class, FullDetails::class ])
@property:GenerateOverview(columnName = "Totál", order = 100, centered = true)
@property:GenerateOverview(renderer = OverviewType.NUMBER, columnName = "Totál", order = 100, centered = true)
@property:ImportFormat
override var totalScore: Int = 0,

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,13 +56,13 @@ data class LocationEntity(
@Column(nullable = false)
@field:JsonView(value = [ Edit::class, FullDetails::class ])
@property:GenerateInput(maxLength = 32, order = 9, label = "Longitude", type = InputType.FLOAT)
@property:GenerateOverview(columnName = "Longitude", order = 4)
@property:GenerateOverview(renderer = OverviewType.NUMBER, columnName = "Longitude", order = 4)
var longitude: Double = 0.0,

@Column(nullable = false)
@field:JsonView(value = [ Edit::class, FullDetails::class ])
@property:GenerateInput(maxLength = 32, order = 8, label = "Latitude", type = InputType.FLOAT)
@property:GenerateOverview(columnName = "Latitude", order = 3)
@property:GenerateOverview(renderer = OverviewType.NUMBER, columnName = "Latitude", order = 3)
var latitude: Double = 0.0,

@Column(nullable = false)
Expand All @@ -74,7 +74,7 @@ data class LocationEntity(
@Column(nullable = false)
@field:JsonView(value = [ Edit::class, FullDetails::class ])
@property:GenerateInput(maxLength = 32, order = 11, label = "Pontosság", defaultValue = "0", type = InputType.FLOAT)
@property:GenerateOverview(columnName = "Pontosság", order = 5)
@property:GenerateOverview(renderer = OverviewType.NUMBER, columnName = "Pontosság", order = 5)
var accuracy: Float = 0.0f,

@Column(nullable = false)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,13 +38,13 @@ data class WaypointEntity(
@Column(nullable = false)
@field:JsonView(value = [ Edit::class, FullDetails::class ])
@property:GenerateInput(maxLength = 32, order = 3, label = "Longitude", type = InputType.FLOAT)
@property:GenerateOverview(columnName = "Longitude", order = 4)
@property:GenerateOverview(renderer = OverviewType.NUMBER, columnName = "Longitude", order = 4)
var longitude: Double = 0.0,

@Column(nullable = false)
@field:JsonView(value = [ Edit::class, FullDetails::class ])
@property:GenerateInput(maxLength = 32, order = 2, label = "Latitude", type = InputType.FLOAT)
@property:GenerateOverview(columnName = "Latitude", order = 3)
@property:GenerateOverview(renderer = OverviewType.NUMBER, columnName = "Latitude", order = 3)
var latitude: Double = 0.0,

@Column(nullable = false)
Expand All @@ -56,7 +56,7 @@ data class WaypointEntity(
@Column(nullable = false)
@field:JsonView(value = [ Edit::class, FullDetails::class ])
@property:GenerateInput(maxLength = 32, order = 5, label = "Pontosság", defaultValue = "0", type = InputType.FLOAT)
@property:GenerateOverview(columnName = "Pontosság", order = 5)
@property:GenerateOverview(renderer = OverviewType.NUMBER, columnName = "Pontosság", order = 5)
var accuracy: Float = 0.0f,

@Column(nullable = false)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ data class FreestyleRaceRecordEntity(
@field:JsonView(value = [ Edit::class ])
@property:GenerateInput(type = InputType.FLOAT3, order = 4, label = "Mért idő", defaultValue = "0.0",
note = "Másodpercben kell megadni, és ponttal (.) van elválasztva, nem vesszővel! 3 tizedes pontig lehet megadni pontosságot.")
@property:GenerateOverview(columnName = "Idő", order = 4, centered = true)
@property:GenerateOverview(renderer = OverviewType.TIME, columnName = "Idő", order = 4, centered = true)
@property:ImportFormat
var time: Float = 0.0f,

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ data class RaceRecordEntity(
@field:JsonView(value = [ Edit::class ])
@property:GenerateInput(type = InputType.FLOAT3, order = 4, label = "Mért idő", defaultValue = "0.0",
note = "Másodpercben kell megadni, és ponttal (.) van elválasztva, nem vesszővel! 3 tizedes pontig lehet megadni pontosságot.")
@property:GenerateOverview(columnName = "Idő", order = 4, centered = true)
@property:GenerateOverview(renderer = OverviewType.TIME, columnName = "Idő", order = 4, centered = true)
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🔴 Critical

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Inspect the OverviewType.TIME enum entry to see its formatter/sorter config
fd -t f 'GenerateOverview.kt' | xargs -I {} sh -c 'echo "=== {} ==="; cat "{}"'

Repository: kir-dev/cmsch

Length of output: 1980


OverviewType.TIME has no formatter configured—raw float seconds will display as raw numbers.

The OverviewType.TIME enum entry defines TIME("time", "number", arrayOf("vertAlign" to "middle")) with no formatter parameter, unlike DATE which explicitly includes "formatter" to "datetime". This means the raw float value (e.g., 83.456 for 1 minute 23.456 seconds) will display as-is in the admin interface rather than formatted as human-readable time. The sorter="number" change ensures correct sorting, but without a formatter, the display will not render the elapsed seconds in the intended format. Either configure a formatter for TIME or choose a different OverviewType that doesn't imply formatting not actually applied.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@backend/src/main/kotlin/hu/bme/sch/cmsch/component/race/RaceRecordEntity.kt`
at line 68, The OverviewType.TIME entry is missing a formatter so elapsed
seconds show raw floats; fix by adding a formatter (e.g., add `"formatter" to
"duration"`) to the TIME enum entry in the OverviewType declaration (so TIME
becomes something like TIME("time", "number", arrayOf("vertAlign" to "middle",
"formatter" to "duration"))), or alternatively change the `@GenerateOverview` use
on the RaceRecordEntity property to a different OverviewType that matches your
intended display (e.g., OverviewType.NUMBER) if a duration formatter isn't
supported.

@property:ImportFormat
var time: Float = 0.0f,

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ data class RiddleCategoryEntity(
@Column(nullable = false)
@field:JsonView(value = [ Edit::class, Preview::class, FullDetails::class ])
@property:GenerateInput(type = InputType.NUMBER, min = 0, order = 2, label = "Kategória id-je")
@property:GenerateOverview(columnName = "Kategória", order = 2)
@property:GenerateOverview(renderer = OverviewType.NUMBER, columnName = "Kategória", order = 2)
@property:ImportFormat
var categoryId: Int = 0,

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ data class RiddleMappingVirtualEntity(
@property:GenerateOverview(renderer = OverviewType.ID, columnName = "ID", order = -1)
override var id: Int = 0,

@property:GenerateOverview(columnName = "Kat. id", order = 1)
@property:GenerateOverview(renderer = OverviewType.NUMBER, columnName = "Kat. id", order = 1)
var category: Int = 0,

@property:GenerateOverview(columnName = "Riddle", order = 2)
Expand All @@ -24,7 +24,7 @@ data class RiddleMappingVirtualEntity(
@property:GenerateOverview(columnName = "Átugorva", order = 4, centered = true, renderer = OverviewType.BOOLEAN)
var skipped: Boolean = false,

@property:GenerateOverview(columnName = "Próbálkozás", order = 5, centered = true)
@property:GenerateOverview(renderer = OverviewType.NUMBER, columnName = "Próbálkozás", order = 5, centered = true)
var attempt: Int = 0,

@property:GenerateOverview(columnName = "Beadva", order = 6, centered = true, renderer = OverviewType.DATE)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,10 @@ data class RiddleStatsVirtualEntity(
@property:GenerateOverview(columnName = "Beadó", order = 1)
var owner: String = "",

@property:GenerateOverview(columnName = "Elfogadott", order = 2, centered = true)
@property:GenerateOverview(renderer = OverviewType.NUMBER, columnName = "Elfogadott", order = 2, centered = true)
var completed: Int = 0,

@property:GenerateOverview(columnName = "Hintek felhasználva", order = 3, centered = true)
@property:GenerateOverview(renderer = OverviewType.NUMBER, columnName = "Hintek felhasználva", order = 3, centered = true)
var hintsUsed: Int = 0,

) : IdentifiableEntity
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@ data class SubmittedTaskEntity(
@Column(nullable = false)
@field:JsonView(value = [ Edit::class, Preview::class, FullDetails::class ])
@property:GenerateInput(type = InputType.NUMBER, order = 10, label = "Adott pont")
@property:GenerateOverview(columnName = "Pont", order = 5, centered = true)
@property:GenerateOverview(renderer = OverviewType.NUMBER,columnName = "Pont", order = 5, centered = true)
var score: Int = 0,

@ColumnDefault("''")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ data class TaskCategoryEntity(
@field:JsonView(value = [ Edit::class, Preview::class, FullDetails::class ])
@property:GenerateInput(type = InputType.NUMBER, min = 0, order = 2, label = "Kategória id-je. " +
"Egyedinek kell lennie, különben összeakad a rendszer!")
@property:GenerateOverview(columnName = "ID", order = 2)
@property:GenerateOverview(renderer = OverviewType.NUMBER, columnName = "ID", order = 2)
@property:ImportFormat
var categoryId: Int = 0,

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ data class TaskEntity(
@Column(nullable = false)
@field:JsonView(value = [ Edit::class, Preview::class, FullDetails::class ])
@property:GenerateInput(type = InputType.NUMBER, min = 0, order = 2, label = "Kategória id-je")
@property:GenerateOverview(columnName = "Kategória", order = 2, centered = true)
@property:GenerateOverview(renderer = OverviewType.NUMBER, columnName = "Kategória", order = 2, centered = true)
@property:ImportFormat
var categoryId: Int = 0,

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ data class TokenListByGroupVirtualEntity(
@property:GenerateOverview(columnName = "Csoport", order = 1)
val groupName: String,

@property:GenerateOverview(columnName = "Tokenek [db]", order = 2, centered = true)
@property:GenerateOverview(renderer = OverviewType.NUMBER, columnName = "Tokenek [db]", order = 2, centered = true)
val tokens: Int,

) : IdentifiableEntity
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ data class TokenListByUserVirtualEntity(
@property:GenerateOverview(columnName = "Csoport", order = 2, centered = true)
val groupName: String,

@property:GenerateOverview(columnName = "Tokenek [db]", order = 3, centered = true)
@property:GenerateOverview(renderer = OverviewType.NUMBER, columnName = "Tokenek [db]", order = 3, centered = true)
val tokens: Int,

) : IdentifiableEntity
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ data class TokenStatVirtualEntity(
@property:GenerateOverview(columnName = "Típus", order = 2)
var type: String = "",

@property:GenerateOverview(columnName = "Beolvasás", order = 3, centered = true)
@property:GenerateOverview(renderer = OverviewType.NUMBER, columnName = "Beolvasás", order = 3, centered = true)
var count: Int = 0

) : IdentifiableEntity
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ data class TokenVirtualEntity(
@property:GenerateOverview(columnName = "Típus", order = 2)
var type: String = "",

@property:GenerateOverview(columnName = "Pont", order = 3, centered = true)
@property:GenerateOverview(renderer = OverviewType.NUMBER, columnName = "Pont", order = 3, centered = true)
var score: Int = 0,

@property:GenerateOverview(columnName = "Beolvasva", order = 4, centered = true, renderer = OverviewType.DATE)
Expand Down
Loading