Add Single-Calc for player name. Refactor admin+single-calc dialogs.
This commit is contained in:
@@ -123,3 +123,23 @@ func GetScoreByPlayerID(c *gin.Context) {
|
|||||||
c.JSON(http.StatusBadRequest, "Invalid request!")
|
c.JSON(http.StatusBadRequest, "Invalid request!")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetScoreByPlayerName POST /score/:player_name
|
||||||
|
func GetScoreByPlayerName(c *gin.Context) {
|
||||||
|
playerName := c.Param("player_name")
|
||||||
|
game, err := GetActiveGame(c)
|
||||||
|
if err != nil {
|
||||||
|
c.JSON(http.StatusBadRequest, gin.H{"error": "No active game available!"})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
score := utils.CalcPlayerScore(playerName, game.Tag)
|
||||||
|
|
||||||
|
if score != score || score == -1 { // NaN
|
||||||
|
c.String(http.StatusNotFound, "Spieler nicht gefunden!")
|
||||||
|
} else if score != -1 {
|
||||||
|
c.String(http.StatusOK, fmt.Sprintf("%.2f", score))
|
||||||
|
} else {
|
||||||
|
c.String(http.StatusBadRequest, "Ungültige Abfrage!")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
1
main.go
1
main.go
@@ -126,6 +126,7 @@ func main() {
|
|||||||
protected.GET("/cache/:player_id", controllers.GetCacheByPlayerID)
|
protected.GET("/cache/:player_id", controllers.GetCacheByPlayerID)
|
||||||
|
|
||||||
protected.GET("/score/:player_id", controllers.GetScoreByPlayerID)
|
protected.GET("/score/:player_id", controllers.GetScoreByPlayerID)
|
||||||
|
protected.POST("/score/:player_name", controllers.GetScoreByPlayerName)
|
||||||
|
|
||||||
protected.GET("/game", controllers.GetGames)
|
protected.GET("/game", controllers.GetGames)
|
||||||
protected.GET("/game_html", controllers.GetGamesHTML)
|
protected.GET("/game_html", controllers.GetGamesHTML)
|
||||||
|
|||||||
100
static/dialogs.js
Normal file
100
static/dialogs.js
Normal file
@@ -0,0 +1,100 @@
|
|||||||
|
const swalClasses = {
|
||||||
|
container: 'text-center',
|
||||||
|
confirmButton: 'btn btn-lg btn-primary',
|
||||||
|
cancelButton: 'btn btn-lg btn-secondary ms-3',
|
||||||
|
popup: 'border p-5',
|
||||||
|
title: 'fs-2',
|
||||||
|
inputLabel: 'fs-5',
|
||||||
|
htmlContainer: 'fs-5'
|
||||||
|
};
|
||||||
|
|
||||||
|
function showSingleCalcDialog(btn) {
|
||||||
|
Swal.fire({
|
||||||
|
title: 'Einzel-Abfrage',
|
||||||
|
input: 'text',
|
||||||
|
inputLabel: 'Welcher Spieler soll abgefragt werden?\nDie Abfrage kann ein paar Sekunden dauern.',
|
||||||
|
inputPlaceholder: 'Spieler-Name eingeben...',
|
||||||
|
confirmButtonText: 'Berechnen',
|
||||||
|
showCancelButton: true,
|
||||||
|
cancelButtonText: 'Abbrechen',
|
||||||
|
customClass: swalClasses,
|
||||||
|
buttonsStyling: false
|
||||||
|
}).then((result) => {
|
||||||
|
if (result.isConfirmed) {
|
||||||
|
htmx.ajax('POST', '/score/' + result.value, {target: '#' + btn.id, swap: 'none'})
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function showSingleCalcResultDialog(xhr, reqPath) {
|
||||||
|
let icon;
|
||||||
|
switch (xhr.status) {
|
||||||
|
case 200:
|
||||||
|
icon = 'success';
|
||||||
|
break;
|
||||||
|
case 404:
|
||||||
|
icon = 'warning';
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
icon = 'error';
|
||||||
|
}
|
||||||
|
|
||||||
|
Swal.fire({
|
||||||
|
title: 'Abfrage für ' + reqPath.replace("/score/", ''),
|
||||||
|
text: "Score: " + xhr.response,
|
||||||
|
icon: icon,
|
||||||
|
customClass: swalClasses
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function showAdminActionExecutedDialog(xhr, method) {
|
||||||
|
Swal.fire({
|
||||||
|
title: 'Action executed',
|
||||||
|
text: xhr.response,
|
||||||
|
icon: xhr.status === 200 ? 'success' : 'error'
|
||||||
|
}).then(() => {
|
||||||
|
if (method === "delete") {
|
||||||
|
location.reload();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function confirmAndTrigger(btn) {
|
||||||
|
Swal.fire({
|
||||||
|
title: btn.innerText,
|
||||||
|
text: 'Do you want to continue?',
|
||||||
|
confirmButtonText: 'Yes',
|
||||||
|
confirmButtonColor: '#dd6b55',
|
||||||
|
denyButtonColor: '#3085d6',
|
||||||
|
icon: 'warning',
|
||||||
|
showDenyButton: true,
|
||||||
|
customClass: swalClasses,
|
||||||
|
buttonsStyling: false
|
||||||
|
}).then((result) => {
|
||||||
|
if (result.isConfirmed) {
|
||||||
|
htmx.trigger(btn, 'confirmed');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function createCodeDialog(btn) {
|
||||||
|
Swal.fire({
|
||||||
|
title: btn.innerText,
|
||||||
|
input: 'select',
|
||||||
|
inputOptions: {
|
||||||
|
'READER': 'Reader',
|
||||||
|
'AUTHOR': 'Author',
|
||||||
|
'ADMIN': 'Admin'
|
||||||
|
},
|
||||||
|
inputPlaceholder: 'Select a role',
|
||||||
|
confirmButtonText: 'Generate',
|
||||||
|
showCancelButton: true,
|
||||||
|
customClass: swalClasses,
|
||||||
|
buttonsStyling: false
|
||||||
|
}).then((result) => {
|
||||||
|
if (result.isConfirmed) {
|
||||||
|
btn.setAttribute('hx-vals', '{"user_role": "' + result.value + '"}');
|
||||||
|
htmx.trigger(btn, 'confirmed');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
@@ -145,42 +145,6 @@ function deselectAllPlayers(playerListId) {
|
|||||||
checkCounter.innerText = 0;
|
checkCounter.innerText = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
function confirmAndTrigger(btn) {
|
|
||||||
Swal.fire({
|
|
||||||
title: btn.innerText,
|
|
||||||
text: 'Do you want to continue?',
|
|
||||||
confirmButtonText: 'Yes',
|
|
||||||
confirmButtonColor: '#dd6b55',
|
|
||||||
denyButtonColor: '#3085d6',
|
|
||||||
icon: 'warning',
|
|
||||||
showDenyButton: true
|
|
||||||
}).then((result) => {
|
|
||||||
if (result.isConfirmed) {
|
|
||||||
htmx.trigger(btn, 'confirmed');
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function createCodeDialog(btn) {
|
|
||||||
Swal.fire({
|
|
||||||
title: btn.innerText,
|
|
||||||
input: 'select',
|
|
||||||
inputOptions: {
|
|
||||||
'READER': 'Reader',
|
|
||||||
'AUTHOR': 'Author',
|
|
||||||
'ADMIN': 'Admin'
|
|
||||||
},
|
|
||||||
inputPlaceholder: 'Select a role',
|
|
||||||
confirmButtonText: 'Generate',
|
|
||||||
showCancelButton: true
|
|
||||||
}).then((result) => {
|
|
||||||
if (result.isConfirmed) {
|
|
||||||
btn.setAttribute('hx-vals', '{"user_role": "' + result.value + '"}');
|
|
||||||
htmx.trigger(btn, 'confirmed');
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function singleCalcSpinner(sender) {
|
function singleCalcSpinner(sender) {
|
||||||
const spinner = '<i class="spinner-grow spinner-grow-sm text-info align-baseline me-2" style="margin-left: 0.91rem;" role="status"></i>';
|
const spinner = '<i class="spinner-grow spinner-grow-sm text-info align-baseline me-2" style="margin-left: 0.91rem;" role="status"></i>';
|
||||||
const score = sender.previousElementSibling.children[1];
|
const score = sender.previousElementSibling.children[1];
|
||||||
|
|||||||
@@ -67,7 +67,7 @@
|
|||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-auto position-absolute end-0">
|
<div class="col-auto position-absolute end-0">
|
||||||
<button class="btn btn-lg btn-outline-secondary text-secondary-emphasis" type="button" disabled>
|
<button class="btn btn-lg btn-outline-secondary text-secondary-emphasis" id="singleCalcBtn" onclick="showSingleCalcDialog(this)">
|
||||||
<i class="bi bi-person me-2"></i>
|
<i class="bi bi-person me-2"></i>
|
||||||
Einzel-Abfrage
|
Einzel-Abfrage
|
||||||
</button>
|
</button>
|
||||||
@@ -76,16 +76,15 @@
|
|||||||
|
|
||||||
<script>
|
<script>
|
||||||
document.body.addEventListener('htmx:afterRequest', function (event) {
|
document.body.addEventListener('htmx:afterRequest', function (event) {
|
||||||
if (event.detail.pathInfo.requestPath.startsWith("/admin/")) {
|
let detail = event.detail;
|
||||||
Swal.fire({
|
let reqPath = detail.pathInfo.requestPath;
|
||||||
title: 'Action executed',
|
let method = detail.requestConfig.verb;
|
||||||
text: event.detail.xhr.response,
|
let xhr = detail.xhr;
|
||||||
icon: event.detail.xhr.status === 200 ? 'success' : 'error'
|
|
||||||
}).then(() => {
|
if (reqPath.startsWith("/admin/")) {
|
||||||
if (event.detail.requestConfig.verb === "delete") {
|
showAdminActionExecutedDialog(xhr, method);
|
||||||
location.reload();
|
} else if (reqPath.startsWith("/score/") && method === "post") {
|
||||||
}
|
showSingleCalcResultDialog(xhr, method);
|
||||||
});
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -5,6 +5,7 @@
|
|||||||
<title>Infantry Skill Calculator</title>
|
<title>Infantry Skill Calculator</title>
|
||||||
<script src="https://unpkg.com/htmx.org@1.9.10"></script>
|
<script src="https://unpkg.com/htmx.org@1.9.10"></script>
|
||||||
<script src="../static/index.js"></script>
|
<script src="../static/index.js"></script>
|
||||||
|
<script src="../static/dialogs.js"></script>
|
||||||
<!-- Bootstrap 5 CSS -->
|
<!-- Bootstrap 5 CSS -->
|
||||||
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet">
|
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet">
|
||||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.min.css">
|
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.min.css">
|
||||||
|
|||||||
Reference in New Issue
Block a user