From f182284f60a50ce25e9578be15d1316844d31d83 Mon Sep 17 00:00:00 2001 From: "nise.moe" Date: Sat, 24 Feb 2024 18:38:37 +0100 Subject: [PATCH] Added custom file names, fixed bugs --- .../nise/controller/SearchController.kt | 101 +++++++++--------- .../src/app/search/search.component.html | 8 +- .../src/app/search/search.component.ts | 8 +- .../corelib/service/download-files.service.ts | 25 +++-- 4 files changed, 78 insertions(+), 64 deletions(-) diff --git a/nise-backend/src/main/kotlin/com/nisemoe/nise/controller/SearchController.kt b/nise-backend/src/main/kotlin/com/nisemoe/nise/controller/SearchController.kt index 73f41cf..139876e 100644 --- a/nise-backend/src/main/kotlin/com/nisemoe/nise/controller/SearchController.kt +++ b/nise-backend/src/main/kotlin/com/nisemoe/nise/controller/SearchController.kt @@ -171,64 +171,65 @@ class SearchController( fun getSearchSchema(): ResponseEntity { val fields = listOf( // User fields - SchemaField("user_id", "ID", Category.user, Type.number, true, "unique identifier for a user"), + SchemaField("user_id", "ID", Category.user, Type.number, false, "unique identifier for a user"), SchemaField("user_username", "Username", Category.user, Type.string, true, "user's name"), - SchemaField("user_join_date", "Join Date", Category.user, Type.string, true, "when the user joined"), + SchemaField("user_join_date", "Join Date", Category.user, Type.string, false, "when the user joined"), SchemaField("user_country", "Country", Category.user, Type.flag, true, "user's country flag"), - SchemaField("user_country_rank", "Country Rank", Category.user, Type.number, true, "ranking within user's country"), - SchemaField("user_rank", "Rank", Category.user, Type.number, true, "global ranking"), - SchemaField("user_pp_raw", "User PP", Category.user, Type.number, true, "performance points"), - SchemaField("user_accuracy", "User Accuracy", Category.user, Type.number, true, "hit accuracy percentage"), - SchemaField("user_playcount", "Playcount", Category.user, Type.number, true, "total plays"), - SchemaField("user_total_score", "Total Score", Category.user, Type.number, true, "cumulative score"), - SchemaField("user_ranked_score", "Ranked Score", Category.user, Type.number, true, "score from ranked maps"), - SchemaField("user_seconds_played", "Play Time", Category.user, Type.number, true, "total play time in seconds"), - SchemaField("user_count_300", "300s", Category.user, Type.number, true, "number of 300 hits"), - SchemaField("user_count_100", "100s", Category.user, Type.number, true, "number of 100 hits"), - SchemaField("user_count_50", "50s", Category.user, Type.number, true, "number of 50 hits"), - SchemaField("user_count_miss", "Misses", Category.user, Type.number, true, "missed hits"), + SchemaField("user_country_rank", "Country Rank", Category.user, Type.number, false, "ranking within user's country"), + SchemaField("user_rank", "Rank", Category.user, Type.number, false, "global ranking"), + SchemaField("user_pp_raw", "User PP", Category.user, Type.number, false, "performance points"), + SchemaField("user_accuracy", "User Accuracy", Category.user, Type.number, false, "hit accuracy percentage"), + SchemaField("user_playcount", "Playcount", Category.user, Type.number, false, "total plays"), + SchemaField("user_total_score", "Total Score", Category.user, Type.number, false, "cumulative score"), + SchemaField("user_ranked_score", "Ranked Score", Category.user, Type.number, false, "score from ranked maps"), + SchemaField("user_seconds_played", "Play Time", Category.user, Type.number, false, "total play time in seconds"), + SchemaField("user_count_300", "300s", Category.user, Type.number, false, "number of 300 hits"), + SchemaField("user_count_100", "100s", Category.user, Type.number, false, "number of 100 hits"), + SchemaField("user_count_50", "50s", Category.user, Type.number, false, "number of 50 hits"), + SchemaField("user_count_miss", "Misses", Category.user, Type.number, false, "missed hits"), // Score fields - SchemaField("beatmap_id", "Beatmap ID", Category.score, Type.number, true, "identifies the beatmap"), - SchemaField("count_300", "300s", Category.score, Type.number, true, "number of 300 hits in score"), - SchemaField("count_100", "100s", Category.score, Type.number, true, "number of 100 hits in score"), - SchemaField("count_50", "50s", Category.score, Type.number, true, "number of 50 hits in score"), - SchemaField("count_miss", "Misses", Category.score, Type.number, true, "missed hits in score"), - SchemaField("date", "Date", Category.score, Type.number, true, "when score was achieved"), - SchemaField("max_combo", "Max Combo", Category.score, Type.number, true, "highest combo in score"), - SchemaField("mods", "Mods", Category.score, Type.number, true, "game modifiers used"), - SchemaField("perfect", "Perfect", Category.score, Type.boolean, true, "if score is a full combo"), + SchemaField("id", "ID", Category.score, Type.number, false, "unique identifier for a score"), + SchemaField("beatmap_id", "Beatmap ID", Category.score, Type.number, false, "identifies the beatmap"), + SchemaField("count_300", "300s", Category.score, Type.number, false, "number of 300 hits in score"), + SchemaField("count_100", "100s", Category.score, Type.number, false, "number of 100 hits in score"), + SchemaField("count_50", "50s", Category.score, Type.number, false, "number of 50 hits in score"), + SchemaField("count_miss", "Misses", Category.score, Type.number, false, "missed hits in score"), + SchemaField("date", "Date", Category.score, Type.string, true, "when score was achieved"), + SchemaField("max_combo", "Max Combo", Category.score, Type.number, false, "highest combo in score"), + SchemaField("mods", "Mods", Category.score, Type.number, false, "game modifiers used"), + SchemaField("perfect", "Perfect", Category.score, Type.boolean, false, "if score is a full combo"), SchemaField("pp", "Score PP", Category.score, Type.number, true, "performance points for score"), - SchemaField("rank", "Rank", Category.score, Type.grade, true, "score grade"), - SchemaField("replay_id", "Replay ID", Category.score, Type.number, true, "identifier for replay"), - SchemaField("score", "Score", Category.score, Type.number, true, "score value"), - SchemaField("ur", "UR", Category.score, Type.number, true, "unstable rate"), - SchemaField("frametime", "Frame Time", Category.score, Type.number, true, "average frame time during play"), - SchemaField("edge_hits", "Edge Hits", Category.score, Type.number, true, "hits at the edge of hit window"), - SchemaField("snaps", "Snaps", Category.score, Type.number, true, "rapid cursor movements"), + SchemaField("rank", "Rank", Category.score, Type.grade, false, "score grade"), + SchemaField("replay_id", "Replay ID", Category.score, Type.number, false, "identifier for replay"), + SchemaField("score", "Score", Category.score, Type.number, false, "score value"), + SchemaField("ur", "UR", Category.score, Type.number, false, "unstable rate"), + SchemaField("frametime", "Frame Time", Category.score, Type.number, false, "average frame time during play"), + SchemaField("edge_hits", "Edge Hits", Category.score, Type.number, false, "hits at the edge of hit window"), + SchemaField("snaps", "Snaps", Category.score, Type.number, false, "rapid cursor movements"), SchemaField("adjusted_ur", "Adj. UR", Category.score, Type.number, true, "adjusted unstable rate"), - SchemaField("mean_error", "Mean Error", Category.score, Type.number, true, "average timing error"), - SchemaField("error_variance", "Error Var.", Category.score, Type.number, true, "variability of error in scores"), - SchemaField("error_standard_deviation", "Error SD", Category.score, Type.number, true, "standard deviation of error"), - SchemaField("minimum_error", "Min Error", Category.score, Type.number, true, "smallest error recorded"), - SchemaField("maximum_error", "Max Error", Category.score, Type.number, true, "largest error recorded"), - SchemaField("error_range", "Error Range", Category.score, Type.number, true, "range between min and max error"), - SchemaField("error_coefficient_of_variation", "Error CV", Category.score, Type.number, true, "relative variability of error"), - SchemaField("error_kurtosis", "Kurtosis", Category.score, Type.number, true, "peakedness of error distribution"), - SchemaField("error_skewness", "Skewness", Category.score, Type.number, true, "asymmetry of error distribution"), - SchemaField("keypresses_median_adjusted", "KP Median Adj.", Category.score, Type.number, true, "median of adjusted keypresses"), - SchemaField("keypresses_standard_deviation_adjusted", "KP std. Adj.", Category.score, Type.number, true, "std. dev of adjusted keypresses"), - SchemaField("sliderend_release_median_adjusted", "Sliderend Median Adj.", Category.score, Type.number, true, "median of adjusted sliderend releases"), - SchemaField("sliderend_release_standard_deviation_adjusted", "Sliderend std. Adj.", Category.score, Type.number, true, "std. dev of adjusted sliderend releases"), + SchemaField("mean_error", "Mean Error", Category.score, Type.number, false, "average timing error"), + SchemaField("error_variance", "Error Var.", Category.score, Type.number, false, "variability of error in scores"), + SchemaField("error_standard_deviation", "Error SD", Category.score, Type.number, false, "standard deviation of error"), + SchemaField("minimum_error", "Min Error", Category.score, Type.number, false, "smallest error recorded"), + SchemaField("maximum_error", "Max Error", Category.score, Type.number, false, "largest error recorded"), + SchemaField("error_range", "Error Range", Category.score, Type.number, false, "range between min and max error"), + SchemaField("error_coefficient_of_variation", "Error CV", Category.score, Type.number, false, "relative variability of error"), + SchemaField("error_kurtosis", "Kurtosis", Category.score, Type.number, false, "peakedness of error distribution"), + SchemaField("error_skewness", "Skewness", Category.score, Type.number, false, "asymmetry of error distribution"), + SchemaField("keypresses_median_adjusted", "KP Median Adj.", Category.score, Type.number, false, "median of adjusted keypresses"), + SchemaField("keypresses_standard_deviation_adjusted", "KP std. Adj.", Category.score, Type.number, false, "std. dev of adjusted keypresses"), + SchemaField("sliderend_release_median_adjusted", "Sliderend Median Adj.", Category.score, Type.number, false, "median of adjusted sliderend releases"), + SchemaField("sliderend_release_standard_deviation_adjusted", "Sliderend std. Adj.", Category.score, Type.number, false, "std. dev of adjusted sliderend releases"), // Beatmap fields - SchemaField("beatmap_artist", "Artist", Category.beatmap, Type.string, true, "artist of the beatmap"), - SchemaField("beatmap_beatmapset_id", "Set ID", Category.beatmap, Type.number, true, "id of the beatmap set"), - SchemaField("beatmap_creator", "Creator", Category.beatmap, Type.string, true, "creator of the beatmap"), - SchemaField("beatmap_source", "Source", Category.beatmap, Type.string, true, "source of the beatmap music"), - SchemaField("beatmap_star_rating", "Stars", Category.beatmap, Type.number, true, "(★) difficulty rating of the beatmap"), - SchemaField("beatmap_title", "Title", Category.beatmap, Type.string, true, "title of the beatmap"), - SchemaField("beatmap_version", "Version", Category.beatmap, Type.string, true, "version or difficulty name of the beatmap") + SchemaField("beatmap_artist", "Artist", Category.beatmap, Type.string, false, "artist of the beatmap"), + SchemaField("beatmap_beatmapset_id", "Set ID", Category.beatmap, Type.number, false, "id of the beatmap set"), + SchemaField("beatmap_creator", "Creator", Category.beatmap, Type.string, false, "creator of the beatmap"), + SchemaField("beatmap_source", "Source", Category.beatmap, Type.string, false, "source of the beatmap music"), + SchemaField("beatmap_star_rating", "Stars", Category.beatmap, Type.number, false, "(★) difficulty rating of the beatmap"), + SchemaField("beatmap_title", "Title", Category.beatmap, Type.string, false, "title of the beatmap"), + SchemaField("beatmap_version", "Version", Category.beatmap, Type.string, false, "version or difficulty name of the beatmap") ) val schema = SearchSchema(fields) return ResponseEntity.ok(schema) diff --git a/nise-frontend/src/app/search/search.component.html b/nise-frontend/src/app/search/search.component.html index 092de06..c269bbf 100644 --- a/nise-frontend/src/app/search/search.component.html +++ b/nise-frontend/src/app/search/search.component.html @@ -74,9 +74,9 @@
tools
- - - + + +
@@ -84,7 +84,7 @@ - {{ column.short_name }} + {{ column.shortName }} diff --git a/nise-frontend/src/app/search/search.component.ts b/nise-frontend/src/app/search/search.component.ts index ad2ad46..fad1ffc 100644 --- a/nise-frontend/src/app/search/search.component.ts +++ b/nise-frontend/src/app/search/search.component.ts @@ -13,7 +13,7 @@ import {LocalCacheService} from "../../corelib/service/local-cache.service"; interface SchemaField { name: string; - short_name: string; + shortName: string; category: 'user' | 'score' | 'beatmap'; type: 'number' | 'string' | 'flag' | 'grade' | 'boolean'; active: boolean; @@ -190,7 +190,11 @@ export class SearchComponent implements OnInit { queries: this.queries, sorting: this.sortingOrder } as any; - this.downloadFilesService.downloadJSON(settings); + this.downloadFilesService.downloadJSON(settings, 'nise-settings'); + } + + getColumns(): string[] { + return this.fields.map(field => field.name); } importSettings(event: any): void { diff --git a/nise-frontend/src/corelib/service/download-files.service.ts b/nise-frontend/src/corelib/service/download-files.service.ts index ac1aa13..9134609 100644 --- a/nise-frontend/src/corelib/service/download-files.service.ts +++ b/nise-frontend/src/corelib/service/download-files.service.ts @@ -6,31 +6,40 @@ import * as XLSX from "xlsx"; }) export class DownloadFilesService { - downloadJSON(input: Object[]) { + downloadJSON(input: Object[], fileName: string = 'data') { const dataStr = JSON.stringify(input); const blob = new Blob([dataStr], { type: 'application/json' }); const url = window.URL.createObjectURL(blob); const link = document.createElement('a'); + link.href = url; - link.download = 'data.json'; + link.download = fileName + '.json'; link.click(); } - downloadCSV(input: Object[]) { - let csvData = input.map(row => Object.values(row).join(',')).join('\n'); + downloadCSV(input: Object[], columns: string[], fileName: string = 'data') { + const header = columns.join(',') + '\n'; + + let csvData = input.map(row => + input.map(row => Object.values(row).join(',')).join('\n') + ).join('\n'); + csvData = header + csvData; + const blob = new Blob([csvData], { type: 'text/csv' }); const url = window.URL.createObjectURL(blob); const link = document.createElement('a'); + link.href = url; - link.download = 'data.csv'; + link.download = fileName + '.csv'; link.click(); } - downloadXLSX(input: Object[]) { + downloadXLSX(input: Object[], fileName: string = 'data') { const ws: XLSX.WorkSheet = XLSX.utils.json_to_sheet(input); const wb: XLSX.WorkBook = XLSX.utils.book_new(); - XLSX.utils.book_append_sheet(wb, ws, 'Data'); - XLSX.writeFile(wb, 'data.xlsx'); + + XLSX.utils.book_append_sheet(wb, ws, 'Main Sheet'); + XLSX.writeFile(wb, fileName + '.xlsx'); } }