diff --git a/src/uproot/_static/monitor.js b/src/uproot/_static/monitor.js index fa4135a..0acec4c 100644 --- a/src/uproot/_static/monitor.js +++ b/src/uproot/_static/monitor.js @@ -651,3 +651,35 @@ window.actuallyRedirect = function() { uproot.alert("The action has completed."); }); }; + +window.actuallyGroup = function() { + const action = uproot.selectedValue("group_action"); + + if (!action) { + return uproot.error(_("No action selected.")); + } + + const groupSize = parseInt(I("group-size")?.value ?? "2", 10); + const shuffle = !!I("group-shuffle")?.checked; + const reload = !!I("group-reload")?.checked; + + if (action === "by_size" && (isNaN(groupSize) || groupSize < 1)) { + return uproot.error(_("Group size must be at least 1.")); + } + + window.bootstrap?.Modal.getOrCreateInstance(I("group-modal")).hide(); + window.invokeFromMonitor("group_players", { action, group_size: groupSize, shuffle, reload }) + .then((result) => { + loadExtraData(); + if (result.groups_created) { + uproot.alert(_("Created #n# group(s).").replace("#n#", result.groups_created)); + } else if (result.players_reset !== undefined) { + uproot.alert(_("Reset group assignment for #n# player(s).").replace("#n#", result.players_reset)); + } else { + uproot.alert(_("The action has completed.")); + } + }) + .catch((err) => { + uproot.error(err.message || _("An error occurred.")); + }); +}; diff --git a/src/uproot/admin.py b/src/uproot/admin.py index abf816d..4850178 100644 --- a/src/uproot/admin.py +++ b/src/uproot/admin.py @@ -52,6 +52,7 @@ adminmessage, advance_by_one, fields_from_all, + group_players, info_online, insert_fields, mark_dropout, @@ -113,6 +114,7 @@ "adminmessage", "advance_by_one", "fields_from_all", + "group_players", "info_online", "insert_fields", "mark_dropout", diff --git a/src/uproot/default/admin/Session.html b/src/uproot/default/admin/Session.html index f99360a..6cb2026 100644 --- a/src/uproot/default/admin/Session.html +++ b/src/uproot/default/admin/Session.html @@ -226,6 +226,11 @@

{% translate %}Player monitor {% translate %}Redirect to URL{% endtranslate %} +
  • + + {% translate %}Group players{% endtranslate %} + +
  • @@ -326,6 +331,48 @@

    {% translate %}Player monitor {% endcall %} + +{% call modal(_, "group", title=_("Group players"), action_text=_("Apply grouping"), action_handler="actuallyGroup()") %} +{{ player_count(_) }} +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + +
    {% translate %}Number of selected players must be divisible by group size.{% endtranslate %}
    +
    +
    + + +
    +
    +
    +
    + + +
    +{% endcall %} +